Drools规则引擎讲解
生活随笔
收集整理的這篇文章主要介紹了
Drools规则引擎讲解
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
文章目錄
- 學前
- 規則引擎
- 作用
- 優勢
- Drools
- 項目搭建流程
- 項目結構
- pom.xml
- 配置文件
- 規則文件
- 語法說明
- 規則說明
- 規則執行代碼
- 規則調用接口
學前
有這樣一串代碼,代表著積分策略業務,計算額外積分金額:
綜上,如果這時由于市場需求變化,又要調整規則時候,則又要進行業務層面的代碼修改、部署,十分麻煩。
那該怎么辦呢?
規則引擎
作用
我們可以把決策規則從應用程序中分離出來,將對系統提供很大的便利
優勢
Drools
Drools是一個基于java的規則引擎,它是開源的,可以將復雜多變的規則從硬編碼中解放出來,以規則腳本的形式存放在文件中,使得規則的變更不需要修正代碼重啟機器就可以立即在線上環境生效。具有易于訪問企業策略、易于調整以及易于管理的特點,作為開源業務規則引擎,符合業內標準,速度快、效率高。
項目搭建流程
以下項目基于Springboot搭建
項目結構
項目存放:image/drool.rar
pom.xml
<!--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>配置文件
@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();} }規則文件
語法說明
規則說明
規則執行代碼
@Service public class RuleEngineServiceImpl implements RuleEngineService {private static final Logger LOGGER = LoggerFactory.getLogger(RuleEngineServiceImpl.class) ;@Overridepublic 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);}@Overridepublic 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()) ;}} }規則調用接口
@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("-");// 入參kieSession.insert(queryParam1) ;kieSession.insert(queryParam2) ;kieSession.insert(this.ruleEngineService) ;// 返參RuleResult resultParam = new RuleResult() ;kieSession.insert(resultParam) ;kieSession.fireAllRules() ;} }由于水平有限,本博客難免有不足,懇請各位大佬不吝賜教!
總結
以上是生活随笔為你收集整理的Drools规则引擎讲解的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 使用自定义表类型(SQL Server
- 下一篇: xml语法基础