1. 項目文件結構
2. maven 依賴
<!-- https://mvnrepository.com/artifact/org.drools/drools-core -->
<dependency>
<groupId>org.drools</groupId>
<artifactId>drools-core</artifactId>
<version>7.0.0.Final</version>
</dependency>
<!-- https://mvnrepository.com/artifact/org.kie/kie-spring -->
<dependency>
<groupId>org.kie</groupId>
<artifactId>kie-spring</artifactId>
<version>7.0.0.Final</version>
</dependency>
<!-- https://mvnrepository.com/artifact/org.drools/drools-compiler -->
<dependency>
<groupId>org.drools</groupId>
<artifactId>drools-compiler</artifactId>
<version>7.0.0.Final</version>
</dependency>
<!-- https://mvnrepository.com/artifact/org.kie/kie-internal -->
<dependency>
<groupId>org.kie</groupId>
<artifactId>kie-internal</artifactId>
<version>7.0.0.Final</version>
</dependency>
3. 在src/main/resources下添加兩個目錄: META-INF和rules
3.1 META-INF下添加kmodule.xml,內容如下:
<kmodule xmlns="http://jboss.org/kie/6.0.0/kmodule">
<kbase name="rules" packages="rules">
<ksession name="ksession-rules"/>
</kbase>
</kmodule>
注意: DroolsService 中 KieSession kSession = kContainer.newKieSession("ksession-rules");
kmodule.xml 中 ksession name 要唯一
3.2 規則文件
package com.haoyi
import com.haoyi.common.pojo.Message
dialect "mvel"
rule "HelloWorld"
dialect "mvel"
when
m : Message(status.equals(Message.HELLO), message : message )
then
System.out.println( message);
modify ( m ) { message = "Goodbye cruel world",status = Message.GOODBYE };
end
rule "GoodBye"
dialect "java"
when
Message( status == Message.GOODBYE, message : message )
then
System.out.println( message );
end
drl 文件的整體結構如下:
package package-name
imports
globals
functions
queries
rules
// package部分
// 這個是用來管理包的,跟java的package概念類似,多個rule文件時,可以按包來管理rule代碼。
// import
// drl 規則文件中,可以直接使用java定義好的類,只需要import進來就好。
// global
// 相當於全局變量聲明,多個規則文件中可共享該變量(後面會演示這一用法),要注意的是:共享全局變量建議不要用Integer這種"簡單"類型,這樣無法在規則文件中修改變量的"值",建議用複雜類型(比如上面的AtomicInteger)
// function
// 即:函數,可以定義一些共用函數,在本drl文件被其它規則共用。
// rule ... when ... then ... end
//rule 就是三大塊中的規則體,以rule開頭,以end 結尾,每個規則文件可以包含多個rule。規則體分爲三個部分,LHS RHS 屬性 三大部分
//LHS:條件部分又被稱之爲 LeftHand Side,簡稱爲 LHS,在一個規則當中 when 與 then 中間的部分就是 LHS 部分。
//在 LHS 當中,可以包含 0~n 個條件,如果 LHS 部分沒空的話,那麼引擎會自動添加一個eval(true)的條件,由於該條件總是返回 true,所以 LHS 爲空的規則總是返回 true。
//RHS:結果部分又被稱之爲 RightHand Side,簡稱爲 RHS,在一個規則當中 then後面部分就是 RHS,只有在 LHS 的所有條件都滿足時 RHS 部分纔會執行。
// rule ... when ... then ... end
// 這個就是真正的規則了,rule後面的"say-hi"爲規則名稱,
// when後面的相當於判斷條件(注:聲明條件的同時,
// 還能聲明所謂fact"變量"-[不太準確,暫且這樣叫吧],
// message:Message(...)這裏就相當於把後面一串東西,保存在message這個fact"變量中)
4. pojo 層
定義一個 Drools 中需要使用到的 Model。
package com.haoyi.common.pojo;
import lombok.Data;
@Data
public class Message {
public static final Integer HELLO = 0;
public static final Integer GOODBYE = 1;
private String messageType;
private Integer status;
}
5. service 層
package com.haoyi.demo.service;
import org.kie.api.KieServices;
import org.kie.api.runtime.KieContainer;
import org.kie.api.runtime.KieSession;
import org.springframework.stereotype.Service;
import com.haoyi.common.pojo.Message;
@Service
public class DroolsService {
public String fireRule(String messageType) {
// load up the knowledge base
KieServices ks = KieServices.Factory.get();
KieContainer kContainer = ks.getKieClasspathContainer();
KieSession kSession = kContainer.newKieSession("ksession-rules");
// go !
Message message = new Message();
// Hello World / Good Bye
message.setMessageType(messageType);
message.setStatus(Message.HELLO);
kSession.insert(message);//插入
kSession.fireAllRules();//執行規則
kSession.dispose();
return message.getMessageType();
}
}
6. controller 層
package com.haoyi.demo.controller;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import org.kie.api.runtime.KieSession;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.servlet.ModelAndView;
import com.haoyi.common.pojo.Address;
import com.haoyi.common.pojo.AddressCheckResult;
import com.haoyi.demo.service.DroolsService;
@RestController
@RequestMapping(value = "hello")
public class HelloWorldController {
Logger logger =LoggerFactory.getLogger(HelloWorldController.class);
// @Autowired
// private KieSession kieSession;
@Autowired
private DroolsService droolsServiceImpl;
/**
* 實現Hello World輸出
* @return
*/
@RequestMapping(value = "helloWorld")
public String helloWorld(){
logger.debug("進入helloWorld處理方法.....");
return "Hello World Java";
}
@RequestMapping("/fireRuleDemo")
public String fireRuleDemo(String messageType){
return droolsServiceImpl.fireRule(messageType);
}
}
通過訪問: http://localhost:8080/hello/fireRuleDemo?messageType=HelloWorld 顯示如下:
http://localhost:8080/hello/fireRuleDemo?messageType=GodBye