您好,登錄后才能下訂單哦!
本篇內容主要講解“怎么理解java規則引擎”,感興趣的朋友不妨來看看。本文介紹的方法操作簡單快捷,實用性強。下面就讓小編來帶大家學習“怎么理解java規則引擎”吧!
規則引擎由推理引擎發展而來,是一種嵌入在應用程序中的組件,實現了將業務決策從應用程序代碼中分離出來,并使用預定義的語義模塊編寫業務決策。接受數據輸入。解釋業務規則,并根據業務規則作出業務決策。在Java中,大多數的規則引擎都實現JSR94。將規則引擎想象成一個以數據和規則作為輸入的系統。他講這些規則定義為我們提供輸出
if x then y
我們的業務代碼里充斥了大量的if/else,當然,我們可以用策略模式+模板模式將if/else抽到各個子類中。但是也增加了類的復雜度。
如果需要修改Java類中的邏輯,在更改進入生產環境前,將會精力一個冗長的過程
硬編碼開發
測試代碼
審核代碼
部署代碼
服務接口單純化,將復雜多變的業務邏輯交給比高級語言更加接近自然語言的規則,讓用戶在web端或cs端自己進行配置發布,將技術和業務邏輯解耦。
谷歌出品的規則引擎框架,也是很多公司選型的第一選擇。基于Charles Forgy's的RETE算法,易于調整以及易于管理的開源業務規則引擎,符合業內標準、速度快、效率高。業務分析人員或審核人員可以利用給他輕松查看業務規則,檢驗已編碼的規則執行了所需業務規則。一般企業都會做二次開發,并且有web端可視化操作界面。
無spring版本,maven引入drools
<dependency> <groupId>org.kie</groupId> <artifactId>kie-api</artifactId> <version>6.3.0.Final</version> </dependency> <dependency> <groupId>org.drools</groupId> <artifactId>drools-core</artifactId> <version>6.3.0.Final</version> </dependency> <dependency> <groupId>org.drools</groupId> <artifactId>drools-compiler</artifactId> <version>6.3.0.Final</version> </dependency> <dependency> <groupId>org.drools</groupId> <artifactId>drools-decisiontables</artifactId> <version>6.3.0.Final</version> </dependency> <dependency> <groupId>org.drools</groupId> <artifactId>drools-templates</artifactId> <version>6.3.0.Final</version> </dependency>
需要在resources下增加META-INF文件夾,并且創建kmodule.xml聲明規則文件的關系
<?xml version="1.0" encoding="UTF-8" ?> <kmodule xmlns="http://jboss.org/kie/6.0.0/kmoudule"> <kbase name="rules" packages="rules1"> <ksession name="ksession-rules" /> </kbase> </kmodule>
編寫規則文件,在resources下創建rules1文件夾,保證和xml文件中的packages一致。新建rule.drl文件,語法有點類似java,最后還是要轉成java的
pacage com.ruleengine.drools // 導入自定義實體類 import com.ruleengine.drools.Message // 規則名 rule 'VIP' when // 進入條件為 status是VIP,并且把message屬性給到printMsg,否則外部無法使用 m : Message( status == Message.VIP , printMsg : message ) then System.out.println( printMsg ); m.setMessage( "普通用戶不打折" ); m.setStatus( Message.COMMON_USER ); // 更新實體 update( m ); end // 第二個規則 rule "commonUser" when Message( status == Message.COMMON_USER, printMsg : message ) then System.out.println( printMsg ); end
調用
public class DroolsMain{ public static void main(String[] args){ KieServices kieServices = KieServices.Factory.get(); KieContainer kieContainer = kieServices.getKieClasspathContainer(); KieSession kSession = kieContainer.newKieSession("ksession-rules"); Message m = new Message(); m.setMessage("VIP打折"); m.setStatus(Message.VIP); // 將實體類插入執行規則 kSession.insert(m); kSession.fireAllRules(); } }
自定義類
public class Message{ public static final int VIP - 1; public staitc final int COMMON_USER = 0; private String message; private String status; public String getMessage(){return this.message;} public int getStatus(){ return this.status; } public void setMessage(String message){ this.message = message; } public void setStatus(int status){ this.status = status; } }
有贊最終選擇了drools規則引擎來做風控邏輯。用來防御以下風險:
盜卡。例:盜用用戶銀行卡,在有贊店鋪上消費
欺詐。例:通過發布低價商品,誘騙消費者購買
套現。例:在自己創建的店鋪里進行虛假交易用以套現信用卡
垃圾信息。例:發布虛假消息、色情等違規商品、頁面
盜賬戶。例:黑客用其他平臺獲取的賬戶密碼通過撞庫來非法盜取用戶在贊平臺的賬戶
from https://tech.youzan.com/rules-engine/
https://github.com/j-easy/easy-rules
輕量級框架和易于學習的API
基于POJO的開發和注解的編程模型
支持從簡單規則創建組合規則的能力
支持使用表達式語言(如MVEL和SpEL),最新版本支持JEXL
facts 規則引擎輸入
rule 規則 rules 規則集合
condition 匹配條件
action 執行動作
通過在POJO上添加注釋,以聲明的方式定義
通過RuleBuilder API,以編程方式定義
更多案例可以到這看 https://github.com/j-easy/easy-rules/tree/master/easy-rules-tutorials
<dependency> <groupId>org.jeasy</groupId> <artifactId>easy-rules-core</artifactId> <version>4.1.0</version> </dependency>
package com.lrq.wechatdemo.rules; import org.jeasy.rules.annotation.Action; import org.jeasy.rules.annotation.Condition; import org.jeasy.rules.annotation.Fact; import org.jeasy.rules.annotation.Rule; import org.jeasy.rules.support.UnitRuleGroup; public class RuleClass { @Rule(priority = 1) //規則設定優先級 public static class FizzRule { @Condition // 返回值為boolean public boolean isFizz(@Fact("number") Integer number) { return number % 5 == 0; } @Action public void printFizz() { System.out.print("fizz\n"); } } @Rule(priority = 2) public static class BuzzRule { @Condition public boolean isBuzz(@Fact("number") Integer number) { return number % 7 == 0; } @Action public void printBuzz() { System.out.print("buzz\n"); } } public static class FizzBuzzRule extends UnitRuleGroup { public FizzBuzzRule(Object... rules) { for (Object rule : rules) { addRule(rule); } } @Override public int getPriority() { return 0; } } @Rule(priority = 3) public static class NonFizzBuzzRule { @Condition public boolean isNotFizzNorBuzz(@Fact("number") Integer number) { // can return true, because this is the latest rule to trigger according to // assigned priorities // and in which case, the number is not fizz nor buzz return number % 5 != 0 || number % 7 != 0; } @Action public void printInput(@Fact("number") Integer number) { System.out.print(number+"\n"); } } }
調用
import org.jeasy.rules.api.Facts; import org.jeasy.rules.api.Rules; import org.jeasy.rules.api.RulesEngine; import org.jeasy.rules.core.DefaultRulesEngine; import org.jeasy.rules.core.RulesEngineParameters; public class RuleJavaClient { public static void main(String[] args) { // 創建規則引擎 RulesEngineParameters parameters = new RulesEngineParameters().skipOnFirstAppliedRule(true); RulesEngine fizzBuzzEngine = new DefaultRulesEngine(parameters); // 創建規則集并注冊規則 Rules rules = new Rules(); rules.register(new RuleClass.FizzRule()); rules.register(new RuleClass.BuzzRule()); rules.register(new RuleClass.FizzBuzzRule(new RuleClass.FizzRule(), new RuleClass.BuzzRule())); rules.register(new RuleClass.NonFizzBuzzRule()); // 執行規則 Facts facts = new Facts(); for (int i = 1; i <= 100; i++) { facts.put("number", i); fizzBuzzEngine.fire(rules, facts); System.out.println(); } } }
在resources下新建yml文件
--- name: "fizz rule" description: "print fizz if the number is multiple of 5" priority: 1 condition: "number % 5 == 0" actions: - "System.out.println(\"fizz\")" --- name: "buzz rule" description: "print buzz if the number is multiple of 7" priority: 2 condition: "number % 7 == 0" actions: - "System.out.println(\"buzz\")" --- name: "fizzbuzz rule" description: "print fizzbuzz if the number is multiple of 5 and 7" priority: 0 condition: "number % 5 == 0 && number % 7 == 0" actions: - "System.out.println(\"fizzbuzz\")" --- name: "non fizzbuzz rule" description: "print the number itself otherwise" priority: 3 condition: "number % 5 != 0 || number % 7 != 0" actions: - "System.out.println(number)"
調用,將yml解析為rules
public class RuleYmlClient { public static void main(String[] args) throws FileNotFoundException { // create a rules engine RulesEngineParameters parameters = new RulesEngineParameters().skipOnFirstAppliedRule(true); RulesEngine fizzBuzzEngine = new DefaultRulesEngine(parameters); // load rules from yml MVELRuleFactory fuleFactory = new MVELRuleFactory(new YamlRuleDefinitionReader()) Rules rules = fuleFactory.createRules(new FileReader("rule.yml")); // fire rules Facts facts = new Facts(); for (int i = 1; i <= 100; i++) { facts.put("number", i); fizzBuzzEngine.fire(rules, facts); System.out.println(); } } }
國內的規則引擎,和drool一樣基于RETE算法建立的。URule Pro是一款由上海銳道信息技術有限公司自主研發的一款純Java規則引擎,它可以運行在Windows、Linux、Unix等各種類型的操作系統之上; URule Pro的規則設計器采用業內首創的純瀏覽器編輯模式,無須安裝任何工具,打開瀏覽器即可完成復雜規則的設計與測試。
旗正規則引擎是由國家科技部和財政部的創新基金支持,專門針對國內規則引擎市場空白的情況,結合國內項目的特點而開發的一款業務規則管理系統(BRMS)產品。規則引擎以規則配置編輯器為規則錄入窗口,以規則引擎為系統運轉動力,以企業規則庫為業務邏輯基礎,輔以規則協同管理、遠程項目與服務管理、集群規則同步等功能模塊,實現業務邏輯的可視化定制,同時又具有快速開發java軟件項目的功能
國內比較大的商業級規則引擎,有專用的CS客戶端。并且支持規則測試、調用外部規則包、操作數據庫、解析excel等騷操作。
到此,相信大家對“怎么理解java規則引擎”有了更深的了解,不妨來實際操作一番吧!這里是億速云網站,更多相關內容可以進入相關頻道進行查詢,關注我們,繼續學習!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。