SpringBoot2-整合-Drools规则引擎实现高效的业务规则

本文源码:GitHub·点这里 || GitEE·点这里 一、Drools引擎简介1、基础简介Drools是一个基于java的规则引擎,开源的,可以将复杂多变的规则从硬编码中解放出来,以规则脚本的形式存放在文件中,使得规则的变更不需要修正代码重启机器就可以立即在线上环境生效。具有易于访问企业策略、易于调整以及易于管理的特点,作为开源业务规则引擎,符合业内标准,速度快、效率高。2、规则语法(1)、演示drl文件格式 package droolRule ;import org.slf4j.Loggerimport 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、配置文件@Configurationpublic 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(); }}这样环境整合就完成了。 ...

October 7, 2019 · 2 min · jiezi

Drools集成CDI(一)

Drools对CDI进行了很好的集成,本节课带大家先了解一下CDI的基本使用,在下一节课中再讲解如何在Drools中应用CDI。CDI简介CDI(Contexts and Dependency Injection 上下文依赖注入),是JAVA官方提供的依赖注入实现。@Inject是JSR330规范实现的,与spring中的@Autowired基本一样,但没有request属性。可参看文档及管网:Weld官网:http://weld.cdi-spec.org/CDI文档:http://docs.jboss.org/cdi/tck…CDI最新版本说明:http://www.cdi-spec.org/news/CDI的基本使用Maven依赖创建Maven项目,引入以下依赖:<!–CDI依赖开始–><dependency> <groupId>javax.enterprise</groupId> <artifactId>cdi-api</artifactId> <version>2.0</version></dependency><dependency> <groupId>org.jboss.weld.se</groupId> <artifactId>weld-se-core</artifactId> <version>3.0.0.Final</version></dependency><!–CDI依赖结束–>其中cdi-api在jdk1.6已经纳入j2ee中。weld-se-core是对cdi-api的封装实现。配置文件在resources下面的META-INF目录下添加beans.xml配置文件,配置文件中的具体配置可参看官方文档。以下示例内容:<?xml version=“1.0” encoding=“UTF-8”?><beans xmlns=“http://java.sun.com/xml/ns/javaee" xmlns:xsi=“http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation=“http://java.sun.com/xml/ns/javaee http://docs.jboss.org/cdi/beans_1_0.xsd"></beans>具体实现先创建一个服务类,DemoService,并提供一个打印的方法:/** * @author zzs /public class DemoService { public void print(){ System.out.println(“Hello Drools!”); }}创建调用类Chapter3并进行调用:/* * @author zzs */public class Chapter3 { private final DemoService demoService; @Inject public Chapter3(DemoService demoService) { this.demoService = demoService; } private void print() { this.demoService.print(); } public static void main(String[] args) { SeContainer seContainer = null; try { seContainer = SeContainerInitializer.newInstance().initialize(); Chapter3 chapter3 = seContainer.select(Chapter3.class).get(); chapter3.print(); } finally { if (seContainer != null && seContainer.isRunning()) { seContainer.close(); } } }}执行main方法,控制台打印“Hello Drools”,即可看到整个过程的实现。这里需要注意的是在构造方法上使用了@Inject,@Inject和我们平时在Spring中使用的@Autowired用法一致。关于此技术点,以录制成视频,发布于《Drools7规则引擎进阶教程》中,详情可免费查看。原文链接:https://www.choupangxia.com/t…相关技术视频CSDN学院:《Drools7规则引擎进阶教程》CSDN学院:《Drools7规则引擎入门教程》关注微信公众更多技术、架构、管理等知识分享,请关注微信公众号:程序新视界(ID:ershixiong_see_world) ...

January 4, 2019 · 1 min · jiezi