SpringBoot整合Drools规则引擎动态⽣成业务规则的实现最近的项⽬中,使⽤的是flowable⼯作流来处理业务流程,但是在业务规则的配置中,是在代码中直接固定写死的,领导说这样不好,需要规则可以动态变化,可以通过页⾯去动态配置改变,所以就花了⼏天时间去研究了⼀下Drools规则引擎框架。然后应⽤到了项⽬中。
⾸先在项⽬中引⼊规则引擎相关依赖
<properties>
<java.version>1.8</java.version>
<drools.version>7.20.0.Final</drools.version>
</properties>
<dependencies>
<!--引⼊规则引擎-->
<dependency>
<groupId>org.kie</groupId>
<artifactId>kie-spring</artifactId>
<version>${drools.version}</version>
<exclusions>
<exclusion>
<groupId>org.springframework</groupId>
<artifactId>spring-tx</artifactId>
</exclusion>
<exclusion>
<groupId>org.springframework</groupId>
<artifactId>spring-beans</artifactId>
</exclusion>
<exclusion>
<groupId>org.springframework</groupId>
<artifactId>spring-core</artifactId>
</exclusion>
<exclusion>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>org.drools</groupId>
<artifactId>drools-compiler</artifactId>
<version>${drools.version}</version>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<scope>provided</scope>
<version>1.18.20</version>
</dependency>
</dependencies>
<build>
<resources>
<resource>
<directory>src/main/resources</directory>
<includes>
<include>**/*.*</include>
</includes>
</resource>
spring framework是什么框架的<resource>
<directory>src/main/java</directory>
<includes>
<include>**/*.xml</include>
</includes>
</resource>
</resources>
</build>
这⾥的drools版本使⽤的是7.20.0.Final,如果想和Flowable结合使⽤,在流程画图中插⼊规则任务,可以将drools版本和flowable starter中管理的drools版本⼀致,⽐如我现在的项⽬中⽤到的
flowable-srping-boot-starter的依赖版本是6.5.0,点进去这个jar包的pom⽂件
再进⼀步点parent标签
然后再点parent标签的依赖
然后再点parent标签内的flowable-root,然后搜索drools
可以看到flowable starter集成管理的drools版本是7.6.0-Final,所以最好和这个版本保持⼀致当然你需要在flowable modeler画图项⽬中引⼊,然后启动flowable modeler程序,在画图界⾯
任务类型中就可以看到⼀个Business rule task,商业规则任务。
如果只是独⽴使⽤,则可以直接使⽤我最开始引⼊的那个版本7.20.0.Final
还有⼀个问题就是如果你的项⽬中引⼊了spring boot的热部署⼯具,
需要把这个依赖注释掉,项⽬中不能引⼊这个jar包,不然这个jar包会影响drools规则引擎执⾏⽣成的规则,⽽且在运⾏规则的时候也不会报错,这是个很隐蔽的坑,我在项⽬中已经踩过坑了,所以特别提⽰⼀下,就是这个jar包存在,规则引擎在触发执⾏规则的时候,是不会执⾏的,在⽇志信息中⼀直显⽰的是执⾏规则0条,即使你的规则⽂件语法没有任何错误,直接将这个依赖删除后,就可以正常执⾏规则了。
引⼊相关依赖后,需要在项⽬中添加配置类:
在config包下创建DroolsAutoConfiguration类
import util.CharsetUtil;
slf4j.Slf4j;
import org.kie.api.KieBase;
import org.kie.api.KieServices;
import org.kie.api.builder.*;
import org.kie.api.runtime.KieContainer;
import org.kie.api.runtime.KieSession;
import org.kie.internal.io.ResourceFactory;
import org.kie.spring.KModuleBeanFactoryPostProcessor;
import org.springframework.dition.ConditionalOnMissingBean;
import t.annotation.Bean;
import t.annotation.Configuration;
import io.Resource;
import io.support.PathMatchingResourcePatternResolver;
import io.support.ResourcePatternResolver;
import java.io.IOException;
/**
* @author xiaomifeng1010
* @version 1.0
* @date: 2021/12/6 9:30
* @Description drools配置类
*/
@Configuration
@Slf4j
public class DroolsAutoConfiguration {
public static final String RULE_PATH="rules/";
public KieServices getKieServices(){
KieServices kieServices = ();
return kieServices;
}
/**
* 管理规则⽂件的位置路径信息
* @return
* @throws IOException
*/
@Bean
@ConditionalOnMissingBean(KieFileSystem.class)
public KieFileSystem kieFileSystem() throws IOException {
KieFileSystem kieFileSystem = getKieServices().newKieFileSystem();
for (Resource file:getRuleFiles()) {
kieFileSystem.wClassPathResource(RULE_Filename(), CharsetUtil.UTF_8)); }
return kieFileSystem;
}
@Bean
@ConditionalOnMissingBean(KieContainer.class)
public KieContainer kieContainer() throws IOException {
KieServices kieServices = getKieServices();
KieRepository kieRepository = Repository();
kieRepository.addKieModule(new KieModule() {
@Override
public ReleaseId getReleaseId() {
DefaultReleaseId();
}
});
KieBuilder kieBuilder = wKieBuilder(kieFileSystem());
kieBuilder.buildAll();
Results results = Results();
if (results.hasMessages(Message.Level.ERROR)){
<(Messages().toString());
}
KieContainer kieContainer = DefaultReleaseId());
return kieContainer;
}
@Bean
@ConditionalOnMissingBean(KieBase.class)
public KieBase kieBase() throws IOException {
KieBase kieBase = kieContainer().getKieBase();
return kieBase;
}
@Bean
@ConditionalOnMissingBean(KieSession.class)
public KieSession kieSession() throws IOException {
return kieContainer().newKieSession();
}
@Bean
@ConditionalOnMissingBean(KModuleBeanFactoryPostProcessor.class)
public KModuleBeanFactoryPostProcessor kModuleBeanFactoryPostProcessor(){
KModuleBeanFactoryPostProcessor kModuleBeanFactoryPostProcessor = new KModuleBeanFactoryPostProcessor(); return kModuleBeanFactoryPostProcessor;
}
/**
* 获取规则⽂件资源
* @return
* @throws IOException
*/
private Resource[] getRuleFiles() throws IOException {
ResourcePatternResolver resourcePatternResolver
=new PathMatchingResourcePatternResolver();
Resource[] resources = Resources("classpath*:" + RULE_PATH + "**/*.*");
return resources;
}
}
然后在项⽬的resources下创建rules⽂件夹存放规则⽂件
创建⼀个drl后缀的规则⽂件FixRateCostCalculatorRule.drl
//package 可以随意指定,没有具体的要求,可以命名成和项⽬相关的,或者直接rules
package com.drools
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论