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

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > python >内容正文

python

python 规则引擎 drools_SpringBoot2整合Drools规则引擎及案例详解

發布時間:2023/12/10 python 26 豆豆
生活随笔 收集整理的這篇文章主要介紹了 python 规则引擎 drools_SpringBoot2整合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、項目結構

SpringBoot2 整合 Drools規則引擎,實現高效的業務規則

2、核心依賴

org.drools

drools-core

7.6.0.Final

org.drools

drools-compiler

7.6.0.Final

org.drools

drools-templates

7.6.0.Final

org.kie

kie-api

7.6.0.Final

org.kie

kie-spring

7.6.0.Final

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·地址

GitEE·地址

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持腳本之家。

總結

以上是生活随笔為你收集整理的python 规则引擎 drools_SpringBoot2整合Drools规则引擎及案例详解的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。