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


如上述這樣的可用“資源”呢!!!


將規則項目生成可供遠程調用的“資源”,按照下面步驟來做:



讓我們來看看我們BUILD後生成的可供遠程調用的資源列表吧



來看看運行後的效果吧



結合多變的業務場景來考慮使用BRMS




現在結合規則讓我們來考慮一下,當我們的業務提出變化後,IT是如何快速相應的吧。

第一步:打開規則引擎,直接online改變規則



第二步:online運行改變規則後的測試用例



第三步:交業務部門審覈測試結果


第四步:在線重build規則工程





第五步:看JAVA代碼執行結果


在實際Web應用中無須改動代碼、無須重啓




結束本次教程


後面的教程會講述stateful(有狀態)和stateless(無狀態)2種的區別,文中也會給出相應的對比和講解。 所以:今天我們使用的是一種stateless的訪問方式。


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章