首页 > 解决方案 > 使用 Maven 项目 (KieScanner) 中的规则将事件处理设置为 STREAM

问题描述

我有一个包含.drl文件规则的 Maven 项目和另一个项目,它是一个SpringBootWeb 服务器。这些规则可以通过 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();
}

标签: spring-bootdrools

解决方案


我终于通过正确设置依赖关系来解决问题。我正在使用和工件6.2.0.Final的版本。我尝试了以下版本:、和,但它们都不起作用。kie-cikie-spring7.7.07.2.06.5.06.4.0

KieSessionBean 的创建方式如下:

@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||找到 .


推荐阅读