代码之家  ›  专栏  ›  技术社区  ›  Aleksandar

将事件处理设置为使用来自maven项目的规则流(kiescanner)

  •  0
  • Aleksandar  · 技术社区  · 6 年前

    我有一个有规则的Maven项目 .drl 文件和另一个项目,它是 SpringBoot Web服务器。规则可以通过post请求发送到服务器,然后将它们添加到maven项目中,并且可以像从一开始就在那里一样被激活。

    因为我更新了maven rules项目(通过调用 mvn clean install )每次提交新规则时。

    我尝试了很多配置,最“合乎逻辑”的镜头是下面这两张:

    第一次尝试:

    @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) 口水的表情,因为它需要 河流 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();
    }
    
    1 回复  |  直到 6 年前
        1
  •  0
  •   Aleksandar    6 年前

    通过正确设置依赖项,我终于解决了这个问题。我正在使用 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;
    }
    

    部分 pom.xml 包含KIE工件版本的文件如下:

    ...
    <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 以及检查正在使用哪些版本的工件/项目。

    这是链接到 the complete pom.xml file 对我有用。 从生成的依赖关系树 MVN依赖项:树 可以找到 ||here|| .