jboss規則引擎KIE Drools 6.3.0 Final 教程(2)
使用JAVA程序調用規則-運行KIE-DROOLS上的規則
第一步:建立一個MAVEN的Java工程
POM.XML
給出pom.xml文件
4.0.0
os.nut.drools
drools-training
0.0.1-SNAPSHOT
6.3.0.Final
guvnor-m2-repo
Guvnor M2 Repo
http://192.168.0.101:8080/kie-drools/maven2/
org.kie
kie-api
${drools.version}
org.drools
drools-core
${drools.version}
org.drools
drools-compiler
${drools.version}
org.drools
drools-decisiontables
${drools.version}
org.drools
drools-templates
${drools.version}
org.kie
kie-ci
${drools.version}
junit
junit
4.7
test
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
如上述這樣的可用“資源”呢!!!
將規則項目生成可供遠程調用的“資源”,按照下面步驟來做:
讓我們來看看我們BUILD後生成的可供遠程調用的資源列表吧
來看看運行後的效果吧
結合多變的業務場景來考慮使用BRMS
現在結合規則讓我們來考慮一下,當我們的業務提出變化後,IT是如何快速相應的吧。
第一步:打開規則引擎,直接online改變規則
第二步:online運行改變規則後的測試用例
第三步:交業務部門審核測試結果
第四步:在線重build規則工程
第五步:看JAVA代碼執行結果
在實際Web應用中無須改動代碼、
無須重啟
結束本次教程
後面的教程會講述stateful(有狀態)和stateless(無狀態)2種的區別,文中也會給出相應的對比和講解。 所以:今天我們使用的是一種
stateless的訪問方式。