当前位置: 首页 > 知识库问答 >
问题:

在新事件的情况下口水融合不触发规则

华阳秋
2023-03-14

我正在进行drools fusion 6.2决赛,希望在流模式下发生新事件时触发规则。但规则本身并没有遭到抨击。

我的规则文件内容如下:

//created on: May 8, 2015
package com.test

import com.test.Applicant
declare Applicant
   @role(event)
end

rule "Your First Rule"
when
    accumulate( $st : Applicant(age: age) over window:time(10ms) from      entry-point X , $c: average ( age ) )
then
    System.out.println("~~~~~~~~~~~~~~~~~~~~~~~~~~~avg~~~~~~~~~~~~~~~~~~~~~~~~~~~~");
    System.out.println($c);
    System.out.println("~~~~~~~~~~~~~~~~~~~~~~~~~~~avg~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~");
end

代码如下:

package com.test;

import org.kie.api.KieBaseConfiguration;
import org.kie.api.conf.EventProcessingOption;
import org.kie.api.io.ResourceType;
import org.kie.api.runtime.KieSessionConfiguration;
import org.kie.api.runtime.conf.ClockTypeOption;
import org.kie.api.runtime.rule.EntryPoint;
import org.kie.internal.KnowledgeBase;
import org.kie.internal.KnowledgeBaseFactory;
import org.kie.internal.builder.KnowledgeBuilder;
import org.kie.internal.builder.KnowledgeBuilderFactory;
import org.kie.internal.io.ResourceFactory;
import org.kie.internal.runtime.StatefulKnowledgeSession;

@SuppressWarnings("deprecation")
public class DroolsTest {


    public DroolsTest() {
        KieBaseConfiguration config_time = KnowledgeBaseFactory.newKnowledgeBaseConfiguration();
        config_time.setOption(EventProcessingOption.STREAM);

        KnowledgeBuilder kbuilder = KnowledgeBuilderFactory.newKnowledgeBuilder();
        kbuilder.add(ResourceFactory.newClassPathResource("test.drl", getClass()), ResourceType.DRL);
        if (kbuilder.hasErrors()) {
            System.out.println("EERRRRRRRROOOOOORRRR");
            System.out.println(kbuilder.getErrors().toString());
            System.out.println("EERRRRRRRROOOOOORRRR");
        }

        KieBaseConfiguration kBaseConfig = KnowledgeBaseFactory.newKnowledgeBaseConfiguration();

        KnowledgeBase kbase = KnowledgeBaseFactory.newKnowledgeBase(kBaseConfig);
        kbase.addKnowledgePackages(kbuilder.getKnowledgePackages());

        KieSessionConfiguration conf = KnowledgeBaseFactory.newKnowledgeSessionConfiguration();
        conf.setOption(ClockTypeOption.get("REALTIME"));
        final StatefulKnowledgeSession ksession = kbase.newStatefulKnowledgeSession(conf, null);
        final EntryPoint atmStream = ksession.getEntryPoint("X");

        for (int i = 0; i < 100; i++) {
            System.out.println("LOOOOOOOOOOOOOOOOOOOOP  " + i);
            Applicant applicant = new Applicant("Mr John Smith " + i, i);
            atmStream.insert(applicant);
//          ksession.fireAllRules();
        }
        ksession.dispose();
    }

    public static void main(String[] args) {
        new DroolsTest();
    }

}

故意调用规则时会触发规则,但如果流中出现新事件,则无法触发规则。

共有2个答案

洪经义
2023-03-14

看起来您已经定义了2个KiebaseConfiguration。config\u时间。setOption(EventProcessingOption.STREAM);已设置为流式处理,但从未使用。

尝试在您实际使用的kBaseConfig上设置EventProcessingOption. STREAM。

咸星波
2023-03-14

如果你不调用fireAllRules,你将看不到规则的任何效果。取消对此行的注释:

ksession.fireAllRules();

尽管如此,通过反复调用fireAllRules来运行会话并不是最好的方式。更好的方法是使用一个线程来调用fireUntilHalt,例如。

    new Thread() {
        @Override
        public void run() {
            kieSession.fireUntilHalt();
        }
    }.start();

并插入来自另一个线程的事件,例如来自循环的事件,同时使用线程模拟事件和时间流逝。从外部源睡眠或读取事件。

 类似资料:
  • 我刚开始流口水,遇到了一个问题。 我简化了规则以显示问题: 基本上,我想计算特定路段上发生的事件(路段是道路的一部分)。当同一链接上发生3个事件时,我希望触发规则。 上面的规则几乎起作用了,但是当它发射时,它发射了3次,每个事件发射一次。我只希望它发射一次。 我错过了什么? 非常感谢。

  • 我使用的API接受单个AKKA接收器,并用数据填充: 有没有一种方法,在不深入阿卡的深度的情况下,用两个汇而不是一个汇来处理输出? 例如 如果我可以访问方法使用的Flow,我可以使用,但流不会公开。 目前唯一的解决方法是将一个处理字符串的水槽传递给两个StringBuilder,以替换,但这似乎违背了AKKA的观点。如果不花几天时间学习AKKA,我就不知道是否有办法将输出从接收器中分离出来。 谢谢

  • 我无法从jbpm业务规则任务中触发规则。似乎找不到进程规则文件。试着解释一下。 进程Test.java简单的设置Message和启动进程: 然后,我运行并正确触发脚本任务(“Hello world”),但在RuleGroup1中找不到规则。drl: 跟踪项目文件夹: 谢谢你的帮助。

  • 试图在我的项目中实现Drools规则,并且我试图将许多转换为Drools规则,但我不确定如何在Drools中添加条件。我的场景是这样的: 我当前的drl文件内容是这样的: 现在我想要一个conditon,如果上面所有条件都失败了,就应该执行它。用口水可以做到这一点吗?如果上述所有条件都失败了,那么其他部分应该执行,我尝试搜索,发现当前drools不支持conditon。如果是这种情况,如何实现这种

  • 尝试以60FPS的速度在屏幕上设置一个具有绝对位置的元素的动画,我注意到大多数CPU时间都由使用。 我可以在不触发重新计算样式的情况下更改 属性吗? 目前我像这样更改位置:; 下面是一个演示:http://jsfiddle.net/pLtvxv41/您可以使用GoogleChrome性能开发工具查看重新计算样式函数的用法。 这能以更有效的方式改变吗?

  • 我正在尝试自动生成作为PowerPoint演示文稿的报告。目前效果不佳的功能是PowerPoint的自动文本自动拟合功能,当文本溢出形状的边界时会出现这种功能。 如果形状设置为文本必须与形状匹配(这是默认设置),则在添加文本时,形状中所有文本的字体大小都会自动减小。这种行为显然只有在应用程序可见时才会激活。这可能是因为实际呈现文本的行为会通知PowerPoint发生溢出,然后触发字体缩小。 当我隐