目的
官方的Drools范例大都是基于纯Java项目或Maven项目,而基于Spring Boot项目的很少。
本文介绍如何在Spring Boot项目上加上Drools规则引擎。
POM依赖
POM文件如下:
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <groupId>com.galaxyyao</groupId> <artifactId>springbootdroolstest1</artifactId> <version>1.0.0</version> <packaging>jar</packaging> <name>springbootdroolstest1</name> <url>http://maven.apache.org</url> <properties> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> <java.version>1.8</java.version> </properties> <parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>1.5.2.RELEASE</version> </parent> <dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <dependency> <groupId>org.drools</groupId> <artifactId>drools-core</artifactId> <version>7.0.0.Final</version> </dependency> <dependency> <groupId>org.drools</groupId> <artifactId>drools-compiler</artifactId> <version>7.0.0.Final</version> </dependency> <dependency> <groupId>org.drools</groupId> <artifactId>drools-decisiontables</artifactId> <version>7.0.0.Final</version> </dependency> <dependency> <groupId>org.drools</groupId> <artifactId>drools-templates</artifactId> <version>7.0.0.Final</version> </dependency> <dependency> <groupId>org.kie</groupId> <artifactId>kie-api</artifactId> <version>7.0.0.Final</version> </dependency> </dependencies> <build> <plugins> <plugin> <artifactId>maven-compiler-plugin</artifactId> </plugin> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> </plugin> <plugin> <groupId>org.codehaus.mojo</groupId> <artifactId>exec-maven-plugin</artifactId> <configuration> <executable>java</executable> <arguments> <argument>com.galaxyyao.springbootdroolstest1.SpringBootDroolsTest1Application</argument> </arguments> </configuration> </plugin> </plugins> </build> </project>
其中比较需要注意的是使用了exec-maven-plugin插件,不然无法启动
引用的Drools包的版本可以自行调整。
Resources
在src/main/resources下添加两个目录:
META-INF和rules
META-INF下添加kmodule.xml,内容如下:
<kmodule xmlns="http://jboss.org/kie/6.0.0/kmodule"> <kbase name="rules" packages="rules"> <ksession name="ksession-rules"/> </kbase> </kmodule>
rules目录下添加一个简单的Hello World规则
package com.galaxyyao.springbootdroolstest1 import com.galaxyyao.springbootdroolstest1.domain.Message dialect "mvel" rule "Hello World" dialect "mvel" when m : Message(status.equals(Message.HELLO), message : message ) then System.out.println( message); modify ( m ) { message = "Goodbye cruel world",status = Message.GOODBYE }; end rule "Good Bye" dialect "java" when Message( status == Message.GOODBYE, message : message ) then System.out.println( message ); end
Domain层
Domain层定义一个Drools中需要使用到的Model:
package com.galaxyyao.springbootdroolstest1.domain; public class Message { public static final Integer HELLO = 0; public static final Integer GOODBYE = 1; private String message; private Integer status; public String getMessage() { return this.message; } public void setMessage(String message) { this.message = message; } public Integer getStatus() { return this.status; } public void setStatus(Integer status) { this.status = status; } }
Service层
Service层负责实际运行规则:
package com.galaxyyao.springbootdroolstest1.service; import org.kie.api.KieServices; import org.kie.api.runtime.KieContainer; import org.kie.api.runtime.KieSession; import org.springframework.stereotype.Service; import com.galaxyyao.springbootdroolstest1.domain.Message; @Service public class DroolsService { public String fireRule() { // load up the knowledge base KieServices ks = KieServices.Factory.get(); KieContainer kContainer = ks.getKieClasspathContainer(); KieSession kSession = kContainer.newKieSession("ksession-rules"); // go ! Message message = new Message(); message.setMessage("Hello World"); message.setStatus(Message.HELLO); kSession.insert(message);//插入 kSession.fireAllRules();//执行规则 kSession.dispose(); return message.getMessage(); } }
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持小牛知识库。
我正在向drools规则引擎插入数据,但我无法理解它是如何处理插入的数据的。插入数据的代码是:
我正在从事这个项目,我的角色是开发使用标准健康保险xml的服务。服务必须在不同的xml字段上进行验证,这涉及将xml数据与数据库表中的数据进行比较。目前,我们假设所有保险公司的验证保持不变。但我怀疑它会保持不变,并且每家公司可能有不同的验证要求。在这种情况下,使用Drools规则引擎并为每家公司开发drl文件并使用规则引擎进行xml验证是个好主意吗
我有这样的情况,在规则文件中的所有规则必须检查执行。如果我的理解是正确的,文档所说的规则将由引擎任意执行。 我有一个或多个疑问。 > 我在许多地方得到了答案,我必须使用显著性功能来按顺序执行它们。如果我使用显著性,并且我有执行所有规则的要求,它真的会大规模地影响性能吗?如果是,它会如何影响性能,甚至规则引擎也会任意执行所有规则,比如一些随机顺序。 提前谢谢。
我在试着处理drools中的列表。我正在传递一个请求,其中包含一个购买列表。我想做几个规则,包括检查大小是否正确,然后如果所有元素都相同,如果所有购买都经过授权。。。我有以下代码,但在使用列表时遇到了问题。这是正确的方法吗?尤其是在检查尺寸时?
我正在为我的项目评估一个规则引擎。该项目将基于hadoop。我用DROOLS做了一些POC。基本上,我使用DROOL在映射器一侧。基于此,以下是我的观察和质疑。 1) a)我使用DROOLS在300万对象上启动了规则(大约需要17秒)b)我使用简单的Java对象(大约需要17秒)为没有DROOLS的300万对象使用了与DRL文件中相同的if/else循环逻辑。b大约比a快100倍。这是正常行为吗?
我正在尝试调用Drools Json api,我的一个事实是Date类型。我不确定如何为此构造json字符串。!!!!!?????????????:( 以下是我所拥有的: 我的drl文件:包com。海滩装饰。常见的 声明订单orderId:Integer customerId:Integer total:java。数学bigdecimic cartId:Integer createdAt:java