spring-boot - 使用 Maven 项目 (KieScanner) 中的规则将事件处理设置为 STREAM
问题描述
我有一个包含.drl
文件规则的 Maven 项目和另一个项目,它是一个SpringBoot
Web 服务器。这些规则可以通过 POST 请求发送到服务器,之后它们被添加到 Maven 项目中,并且可以像从一开始就在那里一样被激活。
规则是“注意到的”,因为mvn clean install
每次提交新规则时我都会更新 Maven 规则项目(通过调用它)。
我尝试了很多配置,最“合乎逻辑”的镜头是下面这两个:
第一次尝试:
@Bean
public KieSession kieSession() {
KieServices ks = KieServices.Factory.get();
KieContainer kContainer = ks.newKieContainer(ks.newReleaseId("ftn.bsep9","drools-spring-kjar", "0.0.1-SNAPSHOT"));
KieBaseConfiguration config = ks.newKieBaseConfiguration();
config.setOption(EventProcessingOption.STREAM);
KieBase kieBase = kContainer.newKieBase("myKBase", config);
KieSession kSession = kieBase.newKieSession();
KieScanner kScanner = ks.newKieScanner(kContainer);
kScanner.start(10000); // check for rule changes every 10 seconds
return kSession;
}
...
第 N 次尝试:
@Bean
public KieSession kieSession() {
KieServices ks = KieServices.Factory.get();
KieFileSystem kfs = ks.newKieFileSystem();
KieModuleModel kModule = ks.newKieModuleModel();
KieBaseModel baseModel = kModule.newKieBaseModel("defaultKieBase")
.setDefault(true)
.setEventProcessingMode(EventProcessingOption.STREAM);
baseModel.newKieSessionModel("defaultKSession")
.setDefault(true)
.setClockType(ClockTypeOption.get("pseudo"));
kfs.writeKModuleXML(kModule.toXML());
KieBuilder kieBuilder = ks.newKieBuilder( kfs ).buildAll();
System.out.println("ERRORS: " + kieBuilder.getResults().getMessages(Message.Level.ERROR).size());
KieContainer kContainer = ks.newKieContainer(ks.newReleaseId(
"ftn.bsep9","drools-spring-kjar", "0.0.1-SNAPSHOT"));
KieSession kSession = kContainer.newKieSession();
KieScanner kScanner = ks.newKieScanner(kContainer);
kScanner.start(10000); // check for rule changes every 10 seconds
return kSession;
}
任何帮助表示赞赏,特别是解释为什么您的代码有效而我的无效。:)
注意:下面的代码有效,但我不能使用over window:time(5m)
drools 的表达式,因为它需要STREAM EventProcessing
。
@Bean
public KieSession kieSession() {
KieServices ks = KieServices.Factory.get();
KieContainer kContainer = ks.newKieContainer(ks.newReleaseId("ftn.bsep9","drools-spring-kjar", "0.0.1-SNAPSHOT"));
KieScanner kScanner = ks.newKieScanner(kContainer);
kScanner.start(10000);
return kContainer.newKieSession();
}
解决方案
我终于通过正确设置依赖关系来解决问题。我正在使用和工件6.2.0.Final
的版本。我尝试了以下版本:、和,但它们都不起作用。kie-ci
kie-spring
7.7.0
7.2.0
6.5.0
6.4.0
KieSession
Bean 的创建方式如下:
@Bean
public KieSession kieSession() {
final KieServices kieServices = KieServices.Factory.get();
final ReleaseId releaseId = kieServices.newReleaseId(groupId, artifactId, version);
final KieContainer kieContainer = kieServices.newKieContainer(releaseId);
final KieSession kieSession = kieContainer.newKieSession();
final KieScanner kieScanner = kieServices.newKieScanner(kieContainer);
kieScanner.start(10000);
log.warn(":) created a KIE Container - returning...");
return kieSession;
}
包含 KIE 工件版本的pom.xml文件的一部分如下:
...
<properties>
<kie.version>6.2.0.Final</kie.version>
</properties>
...
<dependencies>
...
<dependency>
<groupId>org.kie</groupId>
<artifactId>kie-ci</artifactId>
<version>${kie.version}</version>
</dependency>
<dependency>
<groupId>org.kie</groupId>
<artifactId>kie-spring</artifactId>
<version>${kie.version}</version>
</dependency>
...
</dependencies>
在这个过程中的帮助是运行mvn dependency:tree
并检查正在使用哪些工件/项目的版本。
这是对我有用的完整 pom.xml 文件的链接。生成的依赖树mvn dependency:tree
可以在||here||找到 .
推荐阅读
- python - 谷歌日历api acl
- function - 如何访问在前一个函数中创建的第二个函数的标签数组?Win Forms App.NET
- android - 在 android studio 中构建 XML 按钮
- javascript - Javascript 代码在 WordPress 主题文件中不起作用
- javascript - Ag-grid:从 getRowNodeId 回调中检测到重复的节点 id 107,这可能会导致您的网格出现问题
- javascript - 条件渲染显示两个组件
- postgresql - 通过模糊匹配POSTGRESQL从数据库中获取地址
- angular - Visual Studio Code 智能感知未显示字符串的所有属性
- mysql - mySQL 在简单的 WHERE 查询上更新缓慢
- bash - 在 wsl 的批处理脚本中运行多个命令