1. 程式人生 > >SpringBoot2 高階案例(14) : 整合 Drools規則引擎,實現高效的業務規則

SpringBoot2 高階案例(14) : 整合 Drools規則引擎,實現高效的業務規則

一、Drools引擎簡介

1、基礎簡介

Drools是一個基於java的規則引擎,開源的,可以將複雜多變的規則從硬編碼中解放出來,以規則指令碼的形式存放在檔案中,使得規則的變更不需要修正程式碼重啟機器就可以立即在線上環境生效。具有易於訪問企業策略、易於調整以及易於管理的特點,作為開源業務規則引擎,符合業內標準,速度快、效率高。

2、規則語法

(1)、演示drl檔案格式

package droolRule ;
import org.slf4j.Logger
import org.slf4j.LoggerFactory ;
dialect  "java"
rule "paramcheck1"
    when 
    then
        final Logger LOGGER = LoggerFactory.getLogger("param-check-one 規則引擎") ;
        LOGGER.info("引數");
end

(2)、語法說明

· 檔案格式
可以 .drl、xml檔案,也可以Java程式碼塊硬編碼;
· package
規則檔案中,package是必須定義的,必須放在規則檔案第一行;
· import
規則檔案使用到的外部變數,可以是一個類,也可以是類中的可訪問的靜態方法;
· rule
定義一個規則。paramcheck1規則名。規則通常包含三個部分:屬性、條件、結果;

二、整合SpringBoot框架

1、專案結構

2、核心依賴

<!--drools規則引擎-->
<dependency>
    <groupId>org.drools</groupId>
    <artifactId>drools-core</artifactId>
    <version>7.6.0.Final</version>
</dependency>
<dependency>
    <groupId>org.drools</groupId>
    <artifactId>drools-compiler</artifactId>
    <version>7.6.0.Final</version>
</dependency>
<dependency>
    <groupId>org.drools</groupId>
    <artifactId>drools-templates</artifactId>
    <version>7.6.0.Final</version>
</dependency>
<dependency>
    <groupId>org.kie</groupId>
    <artifactId>kie-api</artifactId>
    <version>7.6.0.Final</version>
</dependency>
<dependency>
    <groupId>org.kie</groupId>
    <artifactId>kie-spring</artifactId>
    <version>7.6.0.Final</version>
</dependency>

3、配置檔案

@Configuration
public class RuleEngineConfig {
    private static final Logger LOGGER = LoggerFactory.getLogger(RuleEngineConfig.class) ;
    private static final String RULES_PATH = "droolRule/";
    private final KieServices kieServices = KieServices.Factory.get();
    @Bean
    public KieFileSystem kieFileSystem() throws IOException {
        KieFileSystem kieFileSystem = kieServices.newKieFileSystem();
        ResourcePatternResolver resourcePatternResolver = new PathMatchingResourcePatternResolver();
        Resource[] files = resourcePatternResolver.getResources("classpath*:" + RULES_PATH + "*.*");
        String path = null;
        for (Resource file : files) {
            path = RULES_PATH + file.getFilename();
            LOGGER.info("path="+path);
            kieFileSystem.write(ResourceFactory.newClassPathResource(path, "UTF-8"));
        }
        return kieFileSystem;
    }
    @Bean
    public KieContainer kieContainer() throws IOException {
        KieRepository kieRepository = kieServices.getRepository();
        kieRepository.addKieModule(kieRepository::getDefaultReleaseId);
        KieBuilder kieBuilder = kieServices.newKieBuilder(kieFileSystem());
        kieBuilder.buildAll();
        return kieServices.newKieContainer(kieRepository.getDefaultReleaseId());
    }
    @Bean
    public KieBase kieBase() throws IOException {
        return kieContainer().getKieBase();
    }
    @Bean
    public KieSession kieSession() throws IOException {
        return kieContainer().newKieSession();
    }
    @Bean
    public KModuleBeanFactoryPostProcessor kiePostProcessor() {
        return new KModuleBeanFactoryPostProcessor();
    }
}

這樣環境整合就完成了。

三、演示案例

1、規則檔案

  • 規則一
dialect  "java"
rule "paramcheck1"
    salience 99
    when queryParam : QueryParam(paramId != null && paramSign.equals("+"))
        resultParam : RuleResult()
    then
        final Logger LOGGER = LoggerFactory.getLogger("param-check-one 規則引擎") ;
        LOGGER.info("引數:getParamId="+queryParam.getParamId()+";getParamSign="+queryParam.getParamSign());
        RuleEngineServiceImpl ruleEngineService = new RuleEngineServiceImpl() ;
        ruleEngineService.executeAddRule(queryParam);
        resultParam.setPostCodeResult(true);
end
  • 規則二
dialect  "java"
rule "paramcheck2"
    salience 88
    when queryParam : QueryParam(paramId != null && paramSign.equals("-"))
        resultParam : RuleResult()
    then
        final Logger LOGGER = LoggerFactory.getLogger("param-check-two 規則引擎") ;
        LOGGER.info("引數:getParamId="+queryParam.getParamId()+";getParamSign="+queryParam.getParamSign());
        RuleEngineServiceImpl ruleEngineService = new RuleEngineServiceImpl() ;
        ruleEngineService.executeRemoveRule(queryParam);
        resultParam.setPostCodeResult(true);
end

規則說明:

A、salience 的值越大,越優先執行;

B、規則流程:如果paramId不為null,引數標識是+號,執行新增規則,-號,執行移除規則操作。

2、規則執行程式碼

@Service
public class RuleEngineServiceImpl implements RuleEngineService {
    private static final Logger LOGGER = LoggerFactory.getLogger(RuleEngineServiceImpl.class) ;
    @Override
    public void executeAddRule(QueryParam param) {
        LOGGER.info("引數資料:"+param.getParamId()+";"+param.getParamSign());
        ParamInfo paramInfo = new ParamInfo() ;
        paramInfo.setId(param.getParamId());
        paramInfo.setParamSign(param.getParamSign());
        paramInfo.setCreateTime(new Date());
        paramInfo.setUpdateTime(new Date());
        ParamInfoService paramInfoService = (ParamInfoService)SpringContextUtil.getBean("paramInfoService") ;
        paramInfoService.insertParam(paramInfo);
    }
    @Override
    public void executeRemoveRule(QueryParam param) {
        LOGGER.info("引數資料:"+param.getParamId()+";"+param.getParamSign());
        ParamInfoService paramInfoService = (ParamInfoService)SpringContextUtil.getBean("paramInfoService") ;
        ParamInfo paramInfo = paramInfoService.selectById(param.getParamId());
        if (paramInfo != null){
            paramInfoService.removeById(param.getParamId()) ;
        }
    }
}

3、規則呼叫介面

@RestController
@RequestMapping("/rule")
public class RuleController {
    @Resource
    private KieSession kieSession;
    @Resource
    private RuleEngineService ruleEngineService ;
    @RequestMapping("/param")
    public void param (){
        QueryParam queryParam1 = new QueryParam() ;
        queryParam1.setParamId("1");
        queryParam1.setParamSign("+");
        QueryParam queryParam2 = new QueryParam() ;
        queryParam2.setParamId("2");
        queryParam2.setParamSign("-");
        // 入參
        kieSession.insert(queryParam1) ;
        kieSession.insert(queryParam2) ;
        kieSession.insert(this.ruleEngineService) ;
        // 返參
        RuleResult resultParam = new RuleResult() ;
        kieSession.insert(resultParam) ;
        kieSession.fireAllRules() ;
    }
}

這樣,完整的案例就結束了。

四、原始碼地址

GitHub·地址
https://github.com/cicadasmile/middle-ware-parent
GitEE·地址
https://gitee.com/cicadasmile/middle-ware-parent

相關推薦

SpringBoot2 高階案例(14) : 整合 Drools規則引擎實現高效業務規則

一、Drools引擎簡介 1、基礎簡介 Drools是一個基於java的規則引擎,開源的,可以將複雜多變的規則從硬編碼中解放出來,以規則指令碼的形式存放在檔案中,使得規則的變更不需要修正程式碼重啟機器就可以立即在線上環境生效。具有易於訪問企業策略、易於調整以及易於管理的特點,作為開源業務規則引擎,符合業內

SpringBoot2.0高階案例(07) 整合:Redis叢集 ,實現訊息佇列場景

本文原始碼 GitHub地址:知了一笑 https://github.com/cicadasmile/middle-ware-pa

SpringBoot2高階案例(11):整合 FastDFS 中介軟體實現檔案分散式管理

一、FastDFS簡介 1、FastDFS作用 FastDFS是一個開源的輕量級分散式檔案系統,它對檔案進行管理,功能包括:檔案儲

SpringBoot整合Elasticsearch 進階實現[中文、拼音、繁簡體轉換]高階搜尋

Elasticsearch 分詞 分詞分為讀時分詞和寫時分詞。 讀時分詞發生在使用者查詢時,ES 會即時地對使用者輸入的關鍵詞進行分詞,分詞結果只存在記憶體中,當查詢結束時,分詞結果也會隨即消失。而寫時分詞發生在文件寫入時,ES 會對文件進行分詞後,將結果存入倒排索引,該部分最終會以

Drools6規則引擎探究與在業務中的實踐

在公司接觸到Drools,感覺可以為自己手頭的工作所用,便開始著手Drools6規則引擎的研究之中,採用最新的6.3版本,網上最新的額資源比較少,看了一些英文介紹,前後忙了大概小半年,覺得有必要總結一

SpringBoot2 整合MinIO中介軟體實現檔案便捷管理

本文原始碼:[GitHub·點這裡](https://github.com/cicadasmile/middle-ware-parent) || [GitEE·點這裡](https://gitee.com/cicadasmile/middle-ware-parent) # 一、MinIO簡介 ## 1、

JFinal框架學習------整合bootstrap前端框架實現簡單的增刪改查功能

   Bootstrap,來自 Twitter,是目前最受歡迎的前端框架。Bootstrap 是基於 HTML、CSS、JAVASCRIPT 的,它簡潔靈活,使得 Web 開發更加快捷。 一、JFinal整合bootstrap   1.下載bootstra

O2OA整合政務釘釘實現人員同步、組織同步、單點登入(免登)、待辦待閱訊息推送

廢話不多說,直接上程式碼。 實現與政務釘釘的人員整合,待辦推送以及單點登入. 將次配置檔案由模版路徑拷貝到config目錄下. 配置檔名: zhengwuDingding.json 模版路徑:o2server/config/sample/zhengwuDingding.json 工作路徑:o

Springboot中整合Spring data elasticsearch實現相關CRUD介面

專案環境: JDK:1.8 SringBoot:2.1.0.RELEASE Gardle:gradle-4.10.2 ElasticSearch:elasticsearch-6.2.4 Spring-data-elasticsearch:spring-data-el

Android網路開發回顧之旅 ① 在Android手機整合使用MQTT協議 實現搞掂移動控制硬體端。(附帶Demo)

一、認識MQTT協議。 如果你對MQTT協議的連線過程不熟悉,那沒關係;請看我前面的8266硬體上介紹的MQTT介紹 ,其實也沒啥難,這個MQTT的好處是短小,資訊傳遞快捷 ,適合在

SignalR SelfHost實時訊息,整合到web中實現伺服器訊息推送

先前用過兩次SignalR,但是中途有段時間沒弄了,今天重新弄,發現已經忘得差不多了,做個筆記! 首先建立一個控制檯專案Nuget新增引用聯機搜尋:Microsoft.AspNet.SignalR.SelfHostMicrosoft.Owin.Cors 在Program.cs新增程式碼新增一個

netty整合springMVC實現高效的HTTP服務請求

參考http://blog.csdn.net/imlsz/article/details/42673507的程式碼,謝謝!不過在處理返回servlet的結果時候,按照上文的方法不行。 首先,你必須要了解netty,說簡單點:客戶端通過TCP連結和伺服器建立長連線

Electron 入門案例:讀取本地json檔案實現使用者登入、修改內容最小化最大化關閉視窗

         進入公司實習的第一個月,導師讓學習electron技術,經過兩個星期的學習,做了一個小Demo。主要功能是使用者在訪問後臺伺服器訪問失敗時(登入時會首先訪問後臺伺服器,伺服器訪問失敗時會讀取本地檔案,本案例為json檔案,進行登入),修改使用者資訊(修改本地

springboot整合H2記憶體資料庫實現單元測試與資料庫無關性

一、新建spring boot工程 新建工程的時候,需要加入JPA,H2依賴 二、工程結構 pom檔案依賴如下: <?

SpringBoot 2.0整合阿里雲OSS實現動靜分離架構

前言 相信大部分開發者對下面這張架構圖並不陌生吧,現在很多網站/應用都採用了動靜分離的架構進行部署。博主的部落格也不例外,主機採用的是阿里雲的 ECS,使用 CDN 做靜態內容分發,不過靜態檔案還是儲存在 ECS,採用的是 Nginx 做動靜分離。今天我們來學習一下如何使用阿里雲 OSS 做動靜分離。

Spring Boot 入門(十):整合Redis哨兵模式實現Mybatis二級快取

本片文章續《Spring Boot 入門(九):整合Quartz定時任務》。本文主要基於redis實現了mybatis二級快取。較redis快取,mybaits自帶快取存在缺點(自行谷歌)。本文是基於docker安裝redis主從模式。 1.redis安裝 (1)首先安裝redis叢集模式,建立redis目錄

Spring Boot+Drools規則引擎整合

ood pid message star 定義 比較 java sch 4.0 目的 官方的Drools範例大都是基於純Java項目或Maven項目,而基於Spring Boot項目的很少。 本文介紹如何在Spring Boot項目上加上Drools規則引擎。 POM

spring+maven整合Drools規則引擎詳解

       最近在弄規則引擎,在網上也找了很多,沒有一篇文章是完整的,基本上你能發現好多都是一個模子刻出來的,在這裡我把我整合的步驟給大家貼出來,供大家參考。        我這邊用的開發工具是Eclpise4

Spring Cloud 2.x之Activiti整合規則引擎Drools

日常生活是由規則驅動的。紅燈停綠燈行,這是我們的交通規則;我們站著往上跳,最終還是要落下來,這是地球的引力規則。規則在生活中無處不在。軟體開發中我們也需要規則,滿足什麼規則應該進入什麼分支。如果做過風控系統,就知道風控系統裡存在非常多的規則(比如:age < 16 || age &

SpringBoot2.0高階案例(02) :整合 RocketMQ ,實現請求非同步處理

本文原始碼 碼雲地址:知了一笑 https://gitee.com/cicadasmile/middle-ware-parent