jboss规则引擎KIE Drools 6.3.0 Final 教程(2)
使用JAVA程序调用规则-运行KIE-DROOLS上的规则
第一步:建立一个MAVEN的Java工程
POM.XML
给出pom.xml文件
- <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>os.nut.drools</groupId>
- <artifactId>drools-training</artifactId>
- <version>0.0.1-SNAPSHOT</version>
- <properties>
- <drools.version>6.3.0.Final</drools.version>
- </properties>
- <repositories>
- <repository>
- <id>guvnor-m2-repo</id>
- <name>Guvnor M2 Repo</name>
- <url>http://192.168.0.101:8080/kie-drools/maven2/</url>
- </repository>
- </repositories>
- <dependencies>
- <!-- drools -->
- <dependency>
- <groupId>org.kie</groupId>
- <artifactId>kie-api</artifactId>
- <version>${drools.version}</version>
- </dependency>
- <dependency>
- <groupId>org.drools</groupId>
- <artifactId>drools-core</artifactId>
- <version>${drools.version}</version>
- </dependency>
- <dependency>
- <groupId>org.drools</groupId>
- <artifactId>drools-compiler</artifactId>
- <version>${drools.version}</version>
- </dependency>
- <dependency>
- <groupId>org.drools</groupId>
- <artifactId>drools-decisiontables</artifactId>
- <version>${drools.version}</version>
- </dependency>
- <dependency>
- <groupId>org.drools</groupId>
- <artifactId>drools-templates</artifactId>
- <version>${drools.version}</version>
- </dependency>
- <dependency>
- <groupId>org.kie</groupId>
- <artifactId>kie-ci</artifactId>
- <version>${drools.version}</version>
- </dependency>
- <!-- test -->
- <dependency>
- <groupId>junit</groupId>
- <artifactId>junit</artifactId>
- <version>4.7</version>
- <scope>test</scope>
- </dependency>
- </dependencies>
- </project>
POM.XML解释
关键在于下面这两段:
Java程序通过远程地址读取kie-drools仓库内的规则用的就是这个包。
第二步: 工程结构
保持和远程KIE-DROOLS上的package名字一样
PaymentInfo.java文件
你可以直接把kie-drools内的data object里的这个Facts代码存到你本地来
编写远程调用客户端
- package org.sky.drools.approvaldecision;
- import java.io.InputStream;
- import org.drools.compiler.kproject.ReleaseIdImpl;
- import org.drools.core.io.impl.UrlResource;
- import org.kie.api.KieServices;
- import org.kie.api.builder.KieModule;
- import org.kie.api.builder.KieRepository;
- import org.kie.api.runtime.KieContainer;
- import org.kie.api.runtime.StatelessKieSession;
- public class RemotePaymentRulz {
- public static void main(String[] args) throws Exception {
- String url = "http://192.168.0.101:8080/kie-drools/maven2/org/sky/drools/ApprovalDecision/1.0.0/ApprovalDecision-1.0.0.jar";
- ReleaseIdImpl releaseId = new ReleaseIdImpl("org.sky。drools", "ApprovalDecision", "LATEST");
- KieServices ks = KieServices.Factory.get();
- KieRepository kr = ks.getRepository();
- UrlResource urlResource = (UrlResource) ks.getResources().newUrlResource(url);
- urlResource.setUsername("tomcat");
- urlResource.setPassword("tomcat");
- urlResource.setBasicAuthentication("enabled");
- InputStream is = urlResource.getInputStream();
- KieModule kModule = kr.addKieModule(ks.getResources().newInputStreamResource(is));
- KieContainer kContainer = ks.newKieContainer(kModule.getReleaseId());
- StatelessKieSession kSession = kContainer.newStatelessKieSession("defaultStatelessKieSession");
- PaymentInfo m = new PaymentInfo();
- m.setMoneyAmount(5001);
- kSession.execute(m);
- System.out.println(m.getDecisionPath());
- if (m.getDecisionPath().equalsIgnoreCase("m")) {
- System.out.println("数额<=5000需要经理审批");
- } else {
- System.out.println("数额>5000需要总经理审批");
- }
- }
- }
远程客户端核心代码解释
- String url = "http://192.168.0.101:8080/kie-drools/maven2/org/sky/drools/ApprovalDecision/1.0.0/ApprovalDecision-1.0.0.jar";
- KieServices ks = KieServices.Factory.get();
- KieRepository kr = ks.getRepository();
- UrlResource urlResource = (UrlResource) ks.getResources().newUrlResource(url);
以上代码很简单,它告诉JAVA,需要上哪儿去调用我们位于远程布署的规则
- urlResource.setUsername("tomcat");
- urlResource.setPassword("tomcat");
- urlResource.setBasicAuthentication("enabled");
- InputStream is = urlResource.getInputStream();
- KieModule kModule = kr.addKieModule(ks.getResources().newInputStreamResource(is));
- KieContainer kContainer = ks.newKieContainer(kModule.getReleaseId());
以上代码做的事情就是相当于在IE中打开KIE-DROOLS的Web地址,然后输入用户名、密码并点击登录
- StatelessKieSession kSession = kContainer.newStatelessKieSession("defaultStatelessKieSession");
- PaymentInfo m = new PaymentInfo();
- m.setMoneyAmount(5001);
- kSession.execute(m);
- System.out.println(m.getDecisionPath());
- if (m.getDecisionPath().equalsIgnoreCase("m")) {
- System.out.println("数额<=5000需要经理审批");
- } else {
- System.out.println("数额>5000需要总经理审批");
- }
这段代码用的就是statelessSession接口去调用规则的。
由于规则中有一句话“modify (m) { setDecisionPath("GM") };”
因此规则会依据传入的PaymentInfo.paymentAmount的值去修改PaymentInfo.decisionPath的值。
运行
客户端代码写完了,先不要急着运行!!!
因为我们还没有把我们位于KIE-DROOLS上的项目生成:
org/sky/drools/ApprovalDecision/1.0.0/ApprovalDecision-1.0.0.jar
如上述这样的可用“资源”呢!!!
将规则项目生成可供远程调用的“资源”,按照下面步骤来做:

因为我们还没有把我们位于KIE-DROOLS上的项目生成:
org/sky/drools/ApprovalDecision/1.0.0/ApprovalDecision-1.0.0.jar
如上述这样的可用“资源”呢!!!
将规则项目生成可供远程调用的“资源”,按照下面步骤来做:
让我们来看看我们BUILD后生成的可供远程调用的资源列表吧
来看看运行后的效果吧
结合多变的业务场景来考虑使用BRMS
现在结合规则让我们来考虑一下,当我们的业务提出变化后,IT是如何快速相应的吧。
第一步:打开规则引擎,直接online改变规则
第二步:online运行改变规则后的测试用例
第三步:交业务部门审核测试结果
第四步:在线重build规则工程
第五步:看JAVA代码执行结果
在实际Web应用中无须改动代码、无须重启