日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

drools简单应用

發(fā)布時(shí)間:2023/12/6 编程问答 23 豆豆
生活随笔 收集整理的這篇文章主要介紹了 drools简单应用 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

  當(dāng)某個(gè)服務(wù)的需求經(jīng)常變的時(shí)候,如果使用了硬編碼的方式進(jìn)行開發(fā)會(huì)是一件非常麻煩的事。

  最近在對(duì)項(xiàng)目的積分模塊進(jìn)行改造的時(shí)候想到了規(guī)則引擎,使用規(guī)則引擎處理復(fù)雜而且多變的業(yè)務(wù)邏輯有其非常大的優(yōu)勢(shì),包括實(shí)時(shí)更新、性能等方面。

不多說,直接上代碼:

1、第一步先寫好工具類,有了工具類,只需在應(yīng)用的業(yè)務(wù)場(chǎng)景中調(diào)用相應(yīng)方法就可以了

@Component public class KieSessionUtils {private static KieBase kieBase;//定義規(guī)則文件的包名,與drl文件里的package對(duì)應(yīng)private static final String drlPackage = "rules";//定義drl文件的存放路徑,靜態(tài)變量需要通過在其set方法上打@Value注解,才可實(shí)現(xiàn)配置注入private static String drlPath;//通過配置拉取路徑,這里推薦一下apollo配置中心,使用apollo可以實(shí)時(shí)更改通過@Value拉取的配置@Value("${drools.points.drlPath}")public void setDrlPath(String drlPath){KieSessionUtils.drlPath = drlPath;}/*** 生成kieSeesion會(huì)話* @param ruleName* @return* @throws Exception*/public static KieSession newKieSession(String ruleName) throws Exception {//無狀態(tài)的kieSession,和有狀態(tài)相比,區(qū)別在于不維持會(huì)話,即使用完后自動(dòng)釋放資源,不需要手動(dòng)調(diào)dispose//StatelessKieSession kieSession = getKieBase(ruleName).newStatelessKieSession();//有狀態(tài)的kieSessionKieSession kieSession = getKieBase(ruleName).newKieSession();//添加監(jiān)聽器,這里加的是對(duì)規(guī)則文件運(yùn)行debug監(jiān)聽器,測(cè)試時(shí)最好加上,用于排查問題,生產(chǎn)上可視情況去掉kieSession.addEventListener(new DebugRuleRuntimeEventListener());return kieSession;}/*** 生成kieBase* @param ruleName 規(guī)則文件名* @return* @throws Exception*/protected static KieBase getKieBase(String ruleName) throws Exception {//判斷kieBase和需要獲取的規(guī)則文件是否存在,不存在則重新初始化kieBaseif (kieBase ==null || kieBase.getRule(drlPackage,ruleName)==null) {KieServices kieServices = KieServices.Factory.get();KieFileSystem kfs = kieServices.newKieFileSystem();//獲取規(guī)則數(shù)據(jù)源,這里由于本人項(xiàng)目使用的是springboot,打包會(huì)打成jar包,如果想做實(shí)時(shí)更新,drl文件需要放在jar包外面//獲取resource的方式很多,不一定要用讀取文件的方式,可根據(jù)自己的設(shè)計(jì)和業(yè)務(wù)場(chǎng)景采取不同方案Resource resource = kieServices.getResources().newFileSystemResource(new File(drlPath+"/"+ruleName));resource.setResourceType(ResourceType.DRL);kfs.write(resource);KieBuilder kieBuilder = kieServices.newKieBuilder(kfs).buildAll();if (kieBuilder.getResults().getMessages(Message.Level.ERROR).size() > 0) {throw new Exception();}KieContainer kieContainer = kieServices.newKieContainer(kieServices.getRepository().getDefaultReleaseId());kieBase = kieContainer.getKieBase();}return kieBase;}/*** 更新規(guī)則* @param ruleName 規(guī)則名和規(guī)則文件名* @throws Exception*/public static void refreshRules(String ruleName) throws Exception {//判斷規(guī)則不為null,則移除規(guī)則if (kieBase !=null && kieBase.getRule(drlPackage,ruleName)!=null){//為了方便,本人把規(guī)則名和drl文件名稱統(tǒng)一定義了 kieBase.removeRule(drlPackage,ruleName);//重新初始化kieBase getKieBase(ruleName);}} }

2、編寫規(guī)則文件,這里只給出和規(guī)則引擎格式有關(guān)的代碼

package rules; //包名import com.jiuair.dto.AddObject import java.util.List import java.util.HashMap import java.util.Map import java.util.ArrayList import java.util.Date import java.util.Iterator import java.util.Setglobal com.demo.dto.AddObject addObject //傳入的對(duì)象,同時(shí)也是返回值對(duì)象 rule "add.drl" //規(guī)則名,為了方便,設(shè)為何drl文件名一樣,可以不一樣 when$s : AddObject();then。。。。。//這一段加自己業(yè)務(wù)代碼邏輯,支持jdk$s.setResult(X); //執(zhí)行完邏輯后將結(jié)果設(shè)置到對(duì)象中 end

3、在業(yè)務(wù)場(chǎng)景中調(diào)用工具類里的方法

private AddObject executeAddRule(Object data) {AddObject addObject = new AddObject();addObject.setJsonObject(data);try {//獲取會(huì)話KieSession kieSession = KieSessionUtils.newKieSession("add.drl");//設(shè)置傳入?yún)?shù) kieSession.insert(addObject);//設(shè)置全局參數(shù)kieSession.setGlobal("addObject",addObject);//執(zhí)行規(guī)則 kieSession.fireAllRules();//釋放會(huì)話資源 kieSession.dispose();} catch (Exception e) {e.printStackTrace();}return addObject;}

4、實(shí)現(xiàn)實(shí)時(shí)更新drl文件

   /*** 更新規(guī)則文件,這里只給出service層的代碼了,相信controller大家都會(huì)寫。。。* @param name 名稱為drl的文件名* @param is 由于dubbo不支持流的方式傳輸,文件需在controller轉(zhuǎn)為byte數(shù)組,再傳到service*/@Overridepublic void refreshRule(String name, byte[] is) {try {FileOutputStream fos = new FileOutputStream(drlPath+"/"+name);fos.write(is);fos.close();KieSessionUtils.refreshRules(name);} catch (Exception e) {e.printStackTrace();}}

附maven引包:

<properties><runtime.version>7.20.0.Final</runtime.version></properties><dependency><groupId>org.kie</groupId><artifactId>kie-api</artifactId><version>${runtime.version}</version></dependency><dependency><groupId>org.kie</groupId><artifactId>kie-internal</artifactId><version>${runtime.version}</version></dependency><dependency><groupId>org.drools</groupId><artifactId>drools-core</artifactId><version>${runtime.version}</version></dependency> <dependency><groupId>org.drools</groupId><artifactId>drools-decisiontables</artifactId><version>${runtime.version}</version></dependency>

?

?

import java?詳細(xì)X 沒有英漢互譯結(jié)果
??請(qǐng)嘗試網(wǎng)頁搜索

轉(zhuǎn)載于:https://www.cnblogs.com/jagerLan/p/10857004.html

總結(jié)

以上是生活随笔為你收集整理的drools简单应用的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。