【问题标题】:Drools Stream mode negative patternsDrools 流模式负模式
【发布时间】:2022-01-23 18:48:42
【问题描述】:

我对 Drools 中的流模式有疑问。 我正在使用这个规则

declare MetaMessage
        @role(event)
end
 
rule 'rule1' ruleflow-group 'default'  
    when  
        $inMess : MetaMessage() from entry-point 'default'
        not(MetaMessage(this != $inMess, this after [0s,10s] $inMess) from entry-point 'default')
    then  
        //do things
end

如果我发送 MetaMessage,我希望规则在指定的 10 秒后执行,但没有任何结果。 如果我发送一个新的 MetaMessage,10 秒后,规则就会执行。

编辑:如果我改变规则并去掉不,它就像一个魅力

我不确定我做错了什么。

这就是我创建 KieBase 的方式

KieBaseConfiguration config = KieServices.Factory.get().newKieBaseConfiguration();
config.setOption(EventProcessingOption.STREAM);
KieBase kieBase = kieHelper.build(config);
KieSession kieSession = kieBase.newKieSession();

编辑 2 每次在 Kafka 队列中插入新的 MetaMessage 时,我都会使用 fireAllRules() 触发规则。 所以我有一个消费者收集消息并将它们插入到这样的会话中

EntryPoint ep = kieSession.getEntryPoint("default");
ep.insert(metaMessage);
kieSession.fireAllRules();

编辑 3 我有另一个与前一个一起执行的简单规则

rule "AccumulatedTest"

    when
        accumulate(MetaMessage( timestamp > 0 ); $cnt: count(1))
    then
        log.info("Message n: "+$cnt);
end

第一次插入消息时(新创建 kieSession 时)我得到信息“消息 n:0”。 但随后这条规则不再触发。

如果在会话中插入任何其他消息,则规则不会触发

【问题讨论】:

  • 你是怎么遵守规则的? fireAllRules() 还是 fireUntilHalt()?
  • @EstebanAliverti 我正在使用 fireAllRules()
  • 只有一次?或者您是否有某种定期执行fireAllRules() 的预定作业?
  • 每当有一个新的MetaMessage使用java时,我都会使用fireAllRules()
  • 我编辑了这个问题,提供了有关fireAllRules() 电话的更多详细信息

标签: java spring-boot drools


【解决方案1】:

您使用ruleflow-group 'default',因此您必须将焦点设置到议程组才能执行规则,例如getSession().getAgenda().getAgendaGroup("default").setFocus();

您很可能在事件插入之前或之后设置焦点。插入第一条消息后,您设置了焦点,但当时没有将规则添加到议程(规则尚不符合执行条件),并且焦点被重置到主议程组。 10 秒后,您声明没有触发任何规则,尽管该规则已添加到“默认”议程中(因为主要组有焦点)。您插入第二条消息并将焦点设置为“默认”议程,该议程执行第一条消息触发的议程中的规则。

如果你这样做,规则就会被执行

  1. 删除ruleflow-group(最新文档提升agenda-group
  2. auto-focus true 添加到规则中
  3. 10 秒后设置议程组焦点

how agenda group works

【讨论】:

  • 鉴于他提到通过修改规则触发规则的条件,我猜问题与规则的ruleflow-group 无关。但如果ruleflow-group 是问题所在,您给出了很好的解释!
  • 您好,很抱歉回复延迟,但我正在度假。我尝试从规则中删除ruleflow-group,并从代码中删除,但它不起作用。我必须测试更多的东西,但可能需要一段时间。无论如何,谢谢你的建议,如果我能做到这一点,我会告诉你的
【解决方案2】:

好的,感谢@EstebanAliverti 和@Mike,我已经解决了这个问题。

让我详细说明:

  • 我必须创建一个每 1 秒运行一次的预定 fireAllRules()(正如 @EstebanAliverti 建议的那样)
  • 我从规则中删除了ruleflow-group,因为(正如@Mike 建议的那样)焦点切换回默认议程组,并且在我的实施中,我无法从计划执行中传递议程组

所以现在fireAllRules() 每 1 秒运行一次,并且没有规则流或议程组

现在规则看起来像这样,它按预期工作

declare MetaMessage
        @role(event)
end
 
rule 'rule1'
    when  
        $inMess : MetaMessage() 
        not(MetaMessage(this != $inMess, this after [0s,10s] $inMess) )
    then  
        //do things
end

最后但同样重要的是,由于我没有使用功能,所以我删除了入口点,我现在将消息直接插入到 KieSession 中

kieSession.insert(metaMessage);
kieSession.fireAllRules();

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-03-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多