最近研究了一下規則引擎drools。
這篇博客帶你搭建並運行一個可在線編輯,在線打包,遠程執行的規則引擎(drools)
本篇博客同時參考https://blog.csdn.net/chinrui/article/details/79018351 博客內容
1、搭建Workbench (首先保證主機聯網,有docker環境)
docker run -p 8080:8080 -p 8001:8001 -d --name drools-wb jboss/drools-workbench-showcase:latest
容器啟動完之后就可以訪問如下鏈接(可能docker鏡像下載有點慢。可以切換阿里雲鏡像倉庫)
http://IP:8080/business-central/kie-wb.jsp?locale=zh_CN
界面如下:
用戶名:admin 密碼:admin
登錄進去之后
點擊創建工程
點擊創建Add Asset
創建完對象點擊保存
保存之后回到工程界面
繼續創建rule,向導性規則
package com.myspace.mytest1; rule "myrule1" dialect "java" when $info : mytestmodel1( sex == 0 ) then $info.setName( "李雷" ); end
創建測試場景
編輯如下測試規則
然后返回點擊build
然后點擊
2、創建 kie-server
docker run -p 8180:8080 -d --name kie-server --link drools-wb:kie_wb jboss/kie-server-showcase:latest
運行如上docker容器
容器運行起來之后
訪問如下鏈接http://IP:8180/kie-server/services/rest/server/
在訪問鏈接 http://IP:8180/kie-server/services/rest/server/containers
這里發現已經有了我們剛才創建的kie-server服務列表,這是我們需要創建一個運行容器,返回我們的mytest1rule
發布成功之后
然后在訪問鏈接http://IP:8180/kie-server/services/rest/server/containers
接下來上代碼開發我們的測試程序
maven項目引用依賴
<properties> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> <maven.compiler.source>1.8</maven.compiler.source> <maven.compiler.target>1.8</maven.compiler.target> <drools.version>7.18.0.Final</drools.version> </properties> <dependencies> <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-api</artifactId> <version>${drools.version}</version> </dependency> <dependency> <groupId>org.kie.server</groupId> <artifactId>kie-server-client</artifactId> <version>${drools.version}</version> </dependency> </dependencies>
實體類
package com.myspace.mytest1; /** * This class was automatically generated by the data modeler tool. */ public class mytestmodel1 implements java.io.Serializable { static final long serialVersionUID = 1L; private java.lang.Integer id; private java.lang.String name; private java.lang.Integer sex; public mytestmodel1() { } public java.lang.Integer getId() { return this.id; } public void setId(java.lang.Integer id) { this.id = id; } public java.lang.String getName() { return this.name; } public void setName(java.lang.String name) { this.name = name; } public java.lang.Integer getSex() { return this.sex; } public void setSex(java.lang.Integer sex) { this.sex = sex; } public mytestmodel1(java.lang.Integer id, java.lang.String name, java.lang.Integer sex) { this.id = id; this.name = name; this.sex = sex; } @Override public String toString() { return "mytestmodel1 [id=" + id + ", name=" + name + ", sex=" + sex + "]"; } }
控制台執行代碼
package com.myspace.mytest1; import java.io.IOException; import java.util.LinkedList; import java.util.List; import org.kie.api.KieServices; import org.kie.api.command.Command; import org.kie.api.command.KieCommands; import org.kie.api.runtime.ExecutionResults; import org.kie.server.api.marshalling.MarshallingFormat; import org.kie.server.api.model.ServiceResponse; import org.kie.server.client.KieServicesClient; import org.kie.server.client.KieServicesConfiguration; import org.kie.server.client.KieServicesFactory; import org.kie.server.client.RuleServicesClient; public class droolstest { public static final String SERVER_URL = "http://ip:8180/kie-server/services/rest/server"; public static final String PASSWORD = "kieserver1!"; public static final String USERNAME = "kieserver"; public static final String KIE_CONTAINER_ID = "mytest1_1.0.0-SNAPSHOT"; public static final String KIE_SESSION_ID = "mytest1"; public static void main(String[] args) throws IOException { // KisService 配置信息設置 KieServicesConfiguration kieServicesConfiguration = KieServicesFactory.newRestConfiguration(SERVER_URL, USERNAME, PASSWORD, 10000L); kieServicesConfiguration.setMarshallingFormat(MarshallingFormat.JSON); // 創建規則服務客戶端 KieServicesClient kieServicesClient = KieServicesFactory.newKieServicesClient(kieServicesConfiguration); RuleServicesClient ruleServicesClient = kieServicesClient.getServicesClient(RuleServicesClient.class); // 規則輸入條件 mytestmodel1 mytest = new mytestmodel1(); mytest.setSex(1); // 命令定義,包含插入數據,執行規則 KieCommands kieCommands = KieServices.Factory.get().getCommands(); List<Command<?>> commands = new LinkedList<>(); commands.add(kieCommands.newInsert(mytest, "mytestmodel1")); commands.add(kieCommands.newFireAllRules()); ServiceResponse<ExecutionResults> results = ruleServicesClient.executeCommandsWithResults(KIE_CONTAINER_ID, kieCommands.newBatchExecution(commands, KIE_SESSION_ID)); // 返回值讀取 mytestmodel1 value = (mytestmodel1) results.getResult().getValue("mytestmodel1"); System.out.println(value.toString()); } }
執行結果
當sex為0時有如下輸出
當sex等於1的時候
這里就完成了整個流程的跑通
其中注意鏈接的 KIE_CONTAINER_ID和KIE_SESSION_ID的對應關系