當(dāng)前位置:
首頁(yè) >
前端技术
> javascript
>内容正文
javascript
SpringBoot2 整合 Drools规则引擎,实现高效的业务规则
生活随笔
收集整理的這篇文章主要介紹了
SpringBoot2 整合 Drools规则引擎,实现高效的业务规则
小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
本文源碼:GitHub·點(diǎn)這里 || GitEE·點(diǎn)這里
一、Drools引擎簡(jiǎn)介
1、基礎(chǔ)簡(jiǎn)介
Drools是一個(gè)基于java的規(guī)則引擎,開源的,可以將復(fù)雜多變的規(guī)則從硬編碼中解放出來(lái),以規(guī)則腳本的形式存放在文件中,使得規(guī)則的變更不需要修正代碼重啟機(jī)器就可以立即在線上環(huán)境生效。具有易于訪問企業(yè)策略、易于調(diào)整以及易于管理的特點(diǎn),作為開源業(yè)務(wù)規(guī)則引擎,符合業(yè)內(nèi)標(biāo)準(zhǔn),速度快、效率高。
2、規(guī)則語(yǔ)法
(1)、演示drl文件格式
package droolRule ; import org.slf4j.Logger import org.slf4j.LoggerFactory ; dialect "java" rule "paramcheck1"when thenfinal Logger LOGGER = LoggerFactory.getLogger("param-check-one 規(guī)則引擎") ;LOGGER.info("參數(shù)"); end(2)、語(yǔ)法說明
· 文件格式 可以 .drl、xml文件,也可以Java代碼塊硬編碼; · package 規(guī)則文件中,package是必須定義的,必須放在規(guī)則文件第一行; · import 規(guī)則文件使用到的外部變量,可以是一個(gè)類,也可以是類中的可訪問的靜態(tài)方法; · rule 定義一個(gè)規(guī)則。paramcheck1規(guī)則名。規(guī)則通常包含三個(gè)部分:屬性、條件、結(jié)果;二、整合SpringBoot框架
1、項(xiàng)目結(jié)構(gòu)
2、核心依賴
<!--drools規(guī)則引擎--> <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();@Beanpublic 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;}@Beanpublic KieContainer kieContainer() throws IOException {KieRepository kieRepository = kieServices.getRepository();kieRepository.addKieModule(kieRepository::getDefaultReleaseId);KieBuilder kieBuilder = kieServices.newKieBuilder(kieFileSystem());kieBuilder.buildAll();return kieServices.newKieContainer(kieRepository.getDefaultReleaseId());}@Beanpublic KieBase kieBase() throws IOException {return kieContainer().getKieBase();}@Beanpublic KieSession kieSession() throws IOException {return kieContainer().newKieSession();}@Beanpublic KModuleBeanFactoryPostProcessor kiePostProcessor() {return new KModuleBeanFactoryPostProcessor();} }這樣環(huán)境整合就完成了。
三、演示案例
1、規(guī)則文件
- 規(guī)則一
- 規(guī)則二
規(guī)則說明:
A、salience 的值越大,越優(yōu)先執(zhí)行;
B、規(guī)則流程:如果paramId不為null,參數(shù)標(biāo)識(shí)是+號(hào),執(zhí)行添加規(guī)則,-號(hào),執(zhí)行移除規(guī)則操作。
2、規(guī)則執(zhí)行代碼
@Service public class RuleEngineServiceImpl implements RuleEngineService {private static final Logger LOGGER = LoggerFactory.getLogger(RuleEngineServiceImpl.class) ;@Overridepublic void executeAddRule(QueryParam param) {LOGGER.info("參數(shù)數(shù)據(jù):"+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);}@Overridepublic void executeRemoveRule(QueryParam param) {LOGGER.info("參數(shù)數(shù)據(jù):"+param.getParamId()+";"+param.getParamSign());ParamInfoService paramInfoService = (ParamInfoService)SpringContextUtil.getBean("paramInfoService") ;ParamInfo paramInfo = paramInfoService.selectById(param.getParamId());if (paramInfo != null){paramInfoService.removeById(param.getParamId()) ;}} }3、規(guī)則調(diào)用接口
@RestController @RequestMapping("/rule") public class RuleController {@Resourceprivate KieSession kieSession;@Resourceprivate 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("-");// 入?yún)ieSession.insert(queryParam1) ;kieSession.insert(queryParam2) ;kieSession.insert(this.ruleEngineService) ;// 返參RuleResult resultParam = new RuleResult() ;kieSession.insert(resultParam) ;kieSession.fireAllRules() ;} }這樣,完整的案例就結(jié)束了。
四、源代碼地址
GitHub·地址 https://github.com/cicadasmile/middle-ware-parent GitEE·地址 https://gitee.com/cicadasmile/middle-ware-parent總結(jié)
以上是生活随笔為你收集整理的SpringBoot2 整合 Drools规则引擎,实现高效的业务规则的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: OpenCV 自动调取摄像头并显示屏幕
- 下一篇: SpringBoot2 参数管理实践,入