gpt4 book ai didi

java - KieScanner 不在运行时更新 KieSessions

转载 作者:太空宇宙 更新时间:2023-11-04 09:31:10 25 4
gpt4 key购买 nike

我将 Drools 与 Eclipse 和 Maven 结合使用,用于执行多对多模式匹配的应用程序。我想使用 KieScanner 自动更新正在运行的 KieSession,而无需重新启动应用程序。但这似乎不起作用。

我正在为 org.kie 和 org.drools 使用 7.24.0.t043。

为此,我仅使用本地 Maven 存储库,因此我指定了路径并在 settings.xml 中设置为 true。我还验证了使用最新版本创建新的 KieContainer 会注册更改的规则。 KieScanner.scanNow() 似乎不适合我。我查看了错误日志,似乎根本没有任何错误,一切运行正常。我很确定我也将每个版本正确打包到 kjar 中并将它们安装在我的本地 Maven 存储库中。此外,我将新的 kjar 版本设置为 2.0.0-SNAPSHOT。

kContainer.updateToVersion() 仅当我在 KieSession 设置期间在运行程序类的开头调用它时才对我起作用,但如果我在下面的 while 循环中调用它则不起作用。

在这里,我在运行者类(class)中设置 KieSession:

KieServices ks = KieServices.Factory.get();
ReleaseId releaseId = ks.newReleaseId("com.app", "my-app", "1.0.0");
KieContainer kContainer = ks.newKieContainer(releaseId);
KieScanner kScanner = ks.newKieScanner(kContainer);
kScanner.scanNow();
KieSession kSession = kContainer.getKieBase().newKieSession();

设置完毕后,我将对象插入 kSession 并调用一次 fireAllRules()。

我正在使用 while 循环来打印对我的对象所做的更改(我已将其插入到 kSession 中):

while (true) {
System.out.println("Matches of a1: " + a1.getMatches());
TimeUnit.SECONDS.sleep(10);
}

我希望在更新规则后打印出更新的匹配项,但实际打印并没有更改匹配项。

Pom 文件:

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.app</groupId>
<artifactId>genentech-maven-poc</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>Genentech Maven POC</name>
<properties>
<maven.compiler.target>1.8</maven.compiler.target>
<maven.compiler.source>1.8</maven.compiler.source>
<runtime.version>7.24.0.t043</runtime.version>
</properties>
<repositories>
<repository>
<id>local-repo</id>
<name>Local Maven Repo</name>
<url>file://Users/mtsiang/.m2/repository</url>
<snapshots>
<enabled>true</enabled>
<updatePolicy>always</updatePolicy>
</snapshots>
</repository>
</repositories>
<dependencies>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-simple</artifactId>
<version>1.7.26</version>
</dependency>
<dependency>
<groupId>org.kie</groupId>
<artifactId>kie-api</artifactId>
<version>${runtime.version}</version>
</dependency>
<dependency>
<groupId>org.kie</groupId>
<artifactId>kie-ci</artifactId>
<version>${runtime.version}</version>
<scope>runtime</scope>
</dependency>
<dependency>
<groupId>org.drools</groupId>
<artifactId>drools-core</artifactId>
<version>${runtime.version}</version>
</dependency>
<dependency>
<groupId>org.drools</groupId>
<artifactId>drools-compiler</artifactId>
<version>${runtime.version}</version>
</dependency>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
<scope>test</scope>
</dependency>
</dependencies>
</project>

如果您需要我提供更多信息,请告诉我,我不太确定还需要提供什么信息才能让您了解问题。

最佳答案

所以,我找到了原因。

指定 KieContainer 创建和 releaseId 时,请确保使用“LATEST”,如下所示:

ReleaseId releaseId = ks.newReleaseId("com.app", "my-app", "LATEST"); //instead of "1.0.0"
KieContainer kContainer = ks.newKieContainer(releaseId);

这样,KieScanner 将读取 <release></release> Maven 存储库metadata.xml 文件中的标记。

要触发新规则,您还需要调用kSession.update(FACTHANDLE, OBJ);然后kSession.fireAllRules(); .

关于java - KieScanner 不在运行时更新 KieSessions,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57082035/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com