您的位置:首页 > 其它

jboss规则引擎KIE Drools 6.3.0 Final 教程(2)

2016-07-19 16:42 429 查看

使用JAVA程序调用规则-运行KIE-DROOLS上的规则





第一步:建立一个MAVEN的Java工程



POM.XML

给出pom.xml文件

[html]
view plain
copy





<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代码存到你本地来



编写远程调用客户端

[java]
view plain
copy





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需要总经理审批");  
    }  
}  
}  

远程客户端核心代码解释

[java]
view plain
copy





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,需要上哪儿去调用我们位于远程布署的规则

[java]
view plain
copy





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地址,然后输入用户名、密码并点击登录

[java]
view plain
copy





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

如上述这样的可用“资源”呢!!!

将规则项目生成可供远程调用的“资源”,按照下面步骤来做:



让我们来看看我们BUILD后生成的可供远程调用的资源列表吧



来看看运行后的效果吧



结合多变的业务场景来考虑使用BRMS



现在结合规则让我们来考虑一下,当我们的业务提出变化后,IT是如何快速相应的吧。

第一步:打开规则引擎,直接online改变规则



第二步:online运行改变规则后的测试用例



第三步:交业务部门审核测试结果

第四步:在线重build规则工程



第五步:看JAVA代码执行结果

在实际Web应用中无须改动代码、无须重启



结束本次教程

后面的教程会讲述stateful(有状态)和stateless(无状态)2种的区别,文中也会给出相应的对比和讲解。 所以:今天我们使用的是一种stateless的访问方式。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息