Drools中提供了一个类KieScanner,可以支持从Maven存储库动态的加载并更新规则。官方给出的例子没有很好的证明这一能力。
项目演示共分三个包:
- springboot-drools-dynamic-rules: springboot 和 drools 的结合,drools运行于此,并对外提供rest 接口服务
- springboot-drools-dynamic-rules-api: 一个简单maven项目,包含kjar和springboot-drools-dynamic-rules项目依赖的模型POJO
- springboot-drools-dynamic-rules-kjar:包含了kmodule.xml文件和drools规则.drl文件
规则引擎服务springboot-drools-dynamic-rules中并不包含规则,服务启动时,将从Maven存储库中拉取springboot-drools-dynamic-rules-kjar项目,并加载其中的规则。启动以后,规则引擎服务将不停的监视Maven存储库中的springboot-drools-dynamic-rules-kjar是否更新(轮训监控,监控时间为kScanner 中配置),如果更新则更新其中新的规则,规则引起服务本身不需重新启动。
springboot-drools-dynamic-rules-kjar项目
springboot-drools-dynamic-rules-kjar 项目是一个kjar项目(一下简称kjar项目),其中包含了kmodule.xml文件和Drools规则.drl文件。kjar项目是指引入了kie-maven-plugin插件,并指定打包为kjar,在打包的过程中,插件会校验以drl定义的规则是否可以正常编译。
kjar pom依赖
<dependencies>
<dependency>
<groupId>cn.abel</groupId>
<artifactId>springboot-drools-dynamic-rules-api</artifactId>
<version>1.0-SNAPSHOT</version>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.kie</groupId>
<artifactId>kie-maven-plugin</artifactId>
<version>7.6.0.Final</version>
<extensions>true</extensions>
</plugin>
</plugins>
<pluginManagement>
<plugins>
<!--This plugin's configuration is used to store Eclipse m2e settings
only. It has no influence on the Maven build itself. -->
<plugin>
<groupId>org.eclipse.m2e</groupId>
<artifactId>lifecycle-mapping</artifactId>
<version>1.0.0</version>
<configuration>
<lifecycleMappingMetadata>
<pluginExecutions>
<pluginExecution>
<pluginExecutionFilter>
<groupId>org.kie</groupId>
<artifactId>
kie-maven-plugin
</artifactId>
<versionRange>
[7.6.0.Final,)
</versionRange>
<goals>
<goal>generateModel</goal>
<goal>build</goal>
<goal>injectreactive</goal>
</goals>
</pluginExecutionFilter>
<action>
<ignore></ignore>
</action>
</pluginExecution>
</pluginExecutions>
</lifecycleMappingMetadata>
</configuration>
</plugin>
</plugins>
</pluginManagement>
</build>
springboot-drools-dynamic-rules
springboot-drools-dynamic-rules 是一个Spring Boot项目,可以动态加载规则的关键在于,在KieContainter容器上注册了一个KieScanner:
private KieContainer kContainer;
@PostConstruct
public void setUp() {
KieServices ks = KieServices.Factory.get();
ReleaseId releaseId = ks.newReleaseId("cn.abel", "springboot-drools-dynamic-rules-kjar", "1.0-SNAPSHOT");
kContainer = ks.newKieContainer(releaseId);
KieScanner kScanner = ks.newKieScanner(kContainer);
// Start the KieScanner polling the Maven repository every 10 seconds
kScanner.start(10000L);
}
启动
首先 install springboot-drools-dynamic-rules-api
其次 install springboot-drools-dynamic-rules-kjar
启动 springboot-drools-dynamic-rules
修改规则
重新 install springboot-drools-dynamic-rules-kjar
再次访问
完整代码:https://github.com/527515025/drools-springboot/tree/master/springboot-drools-dynamic-rules