Drools 规则引擎的使用
1、首先引入drools依賴包
dependency><groupId>org.kie</groupId><artifactId>kie-api</artifactId><version>7.7.0.Final</version> </dependency> <dependency><groupId>org.drools</groupId><artifactId>drools-core</artifactId><version>7.7.0.Final</version> </dependency> <dependency><groupId>org.drools</groupId><artifactId>drools-compiler</artifactId><version>7.7.0.Final</version><scope>runtime</scope> </dependency> <dependency><groupId>org.drools</groupId><artifactId>drools-templates</artifactId><version>7.7.0.Final</version> </dependency> <dependency><groupId>org.drools</groupId><artifactId>drools-decisiontables</artifactId><version>7.7.0.Final</version> </dependency>2、編寫執行規則通用方法
public class DroolsExecutorUtil {/*** 執行定義的規則* @param bo 柜子模型* @param rule 規則方法* @param <T> 返回執行結果* @return* @throw Exception*/public static <T> T executeRule(T bo, String rule) throws Exception {if(StringUtils.isEmpty(rule)){return bo;}KnowledgeBuilder kb = KnowledgeBuilderFactory.newKnowledgeBuilder();//以DRL形式加載規則kb.add(ResourceFactory.newByteArrayResource(rule.getBytes(StandardCharsets.UTF_8)), ResourceType.DRL);KnowledgeBuilderErrors errors = kb.getErrors();for (KnowledgeBuilderError error : errors) {throw new Exception("規則文件執行錯誤:"+ error.getMessage());}InternalKnowledgeBase kBase = KnowledgeBaseFactory.newKnowledgeBase();kBase.addPackages(kb.getKnowledgePackages());//獲取規則引擎會話sessionKieSession kieSession = kBase.newKieSession();//插入需匹配的對象kieSession.insert(bo);//執行規則kieSession.fireAllRules();//釋放資源kieSession.dispose();return bo;} }3、創建實體類Order
public class Order {/*** 訂單原始價格(即優惠前的價格)*/private Double originalPrice;/*** 訂單真實價格(即優惠后的價格)*/private Double realPrice;......此處省略get/set方法 }4、編寫規則(以.drl文件形式編寫)
package order.impl import com.example.demo.test.Order// 規則一:價格在100元以下,無優惠 rule "rule_1"lock-on-active truewhen$order: Order(originalPrice < 100) // 匹配模式,到規則引擎中(工作內存)查找Order對象,命名為$orderthen$order.setRealPrice($order.getOriginalPrice());update($order);System.out.println("匹配到規則一,價格在100元以下,無優惠"); end// 規則二:價格在100~200之間,優惠20元 rule "rule_2"lock-on-active truewhen$order: Order(originalPrice >= 100 && originalPrice < 200)then$order.setRealPrice($order.getOriginalPrice() - 20);update($order);System.out.println("匹配到規則二,價格在100~200之間,優惠20元"); end// 規則三:價格在200~300元之間,優惠50元 rule "rule_3"lock-on-active truewhen$order: Order(originalPrice >= 200 && originalPrice < 300)then$order.setRealPrice($order.getOriginalPrice() - 50);update($order);System.out.println("匹配到規則三,價格在200~300元之間,優惠50元"); end// 規則四:價格在300元及以上,優惠100元 rule "rule_4"lock-on-active truewhen$order: Order(originalPrice >= 300)then$order.setRealPrice($order.getOriginalPrice() - 100);update($order);System.out.println("匹配到規則四,價格在300元及以上,優惠100元"); end5、進行測試
public static void main(String[] args) throws Exception {String rule = "";//此部分為上面寫的規則,進行復制即可Order order = new Order();order.setOriginalPrice(160d);System.out.println("匹配規則前優惠后價格:" + order.getRealPrice());DroolsExecutorUtil.executeRule(order,rule);System.out.println("優惠前價格:" + order.getOriginalPrice() + "\n優惠后價格:" + order.getRealPrice()); }6、查看日志輸出
匹配規則前優惠后價格:null
匹配到規則二,價格在100~200之間,優惠20元
優惠前價格:160.0
優惠后價格:140.0
介紹
package:package是必須定義的,必須放在規則文件第一行,package的名字可以是隨意起的
import:導入規則文件需要使用到的外部規則文件或者變量
rule:定義一個具體規則,rule "ruleName",一個規則可以包含三個部分:
?? ?屬性部分:定義當前規則執行的一些屬性等,比如是否可被重復執行、過期時間、生效時間等。
?? ?條件部分(LHS):定義當前規則的條件,如 when Message(); 判斷當前workingMemory中是否存在Message對象。
?? ?結果部分(RHS):即當前規則條件滿足后執行的操作,可以直接調用Fact對象的方法來操作應用。這里可以寫普通java代碼。
rule "ruleName"no-loop truewhen$message:Message(status == 0)thenSystem.out.println("fit");$message.setStatus(1);update($message); end屬性詳情
?? ?no-loop:定義當前的規則是否不允許多次循環執行,默認是false;
?? ?lock-on-active:lock-on-active true 通過這個標簽,可以控制當前的規則只會被執行一次
?? ?date-expires:設置規則的過期時間,默認的時間格式:“日-月-年”
?? ?date-effective:設置規則的生效時間,時間格式同上。
?? ?duration:規則定時,duration 3000,3秒后執行規則
?? ?salience:優先級,數值越大越先執行,這個可以控制規則的執行順序
具體相關屬性詳情可參考:https://www.jianshu.com/p/697b756b7453
總結
以上是生活随笔為你收集整理的Drools 规则引擎的使用的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 【原】两个时间相加的运算符重载实现
- 下一篇: SQLServer中批量插入数据方式的性