KieScanner无法在运行时更新KieSessions

时间:2019-07-17 18:16:33

标签: java drools kie

我正在将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>

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

1 个答案:

答案 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();