我正在将Drools与Eclipse和Maven结合使用来进行许多模式匹配的应用程序。我想使用KieScanner自动更新正在运行的KieSession,而无需重新启动应用程序。但这似乎不起作用。
我将7.24.0.t043用于org.kie和org.drools。
我只为此使用本地Maven存储库,所以我已经指定了路径并在settings.xml中将其设置为true。我还验证了使用最新版本创建新的KieContainer会注册更改的规则。 KieScanner.scanNow()似乎不适合我。我查看了错误日志,似乎根本没有任何错误,一切运行正常。我很确定我也将每个版本正确包装到kjars中,并将它们安装在本地Maven存储库中。此外,我将新的kjar版本设为2.0.0-SNAPSHOT。
kContainer.updateToVersion()
仅对我有效,仅当我在KieSession设置过程中的跑步者课程开始时调用它时,但在下面的while循环中调用时不起作用。
在这里,我正在跑步者课程中设置我的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>
如果您需要我提供更多信息,请告诉我,我不确定我还需要包括什么才能使您了解问题。
答案 0 :(得分:0)
所以,我找到了原因。
在指定KieContainer创建和releaseId时,请确保使用“ LATEST”,如下所示:
ReleaseId releaseId = ks.newReleaseId("com.app", "my-app", "LATEST"); //instead of "1.0.0"
KieContainer kContainer = ks.newKieContainer(releaseId);
通过这种方式,KieScanner将读取Maven回购meta.xml文件中的<release></release>
标记。
要启动新规则,您还需要先致电kSession.update(FACTHANDLE, OBJ);
,然后再致电kSession.fireAllRules();
。