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

Drools流模式负模式

申屠昌胤
2023-03-14

我对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秒后,规则将执行。

编辑:如果我改变规则并去掉not,它就像一个符咒

我不知道我做错了什么。

这就是我创建KieBase的方式

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

编辑2每次在Kafka队列中插入新的元消息时,我都会使用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”。但这条规则不再生效了。

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

共有2个答案

鲁龙野
2023-03-14

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

让我详细说明一下:

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

因此,现在fireAllRules()每隔1s运行一次,没有规则流或议程组

现在规则看起来是这样的,并且它按预期工作

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

最后但并非最不重要的是,由于我没有使用功能性,因此我删除了入口点,因此我现在直接在Kie会话中插入消息

kieSession.insert(metaMessage);
kieSession.fireAllRules();
翟俊茂
2023-03-14

您使用ruleflow-group'default',因此您必须将焦点设置为议程组才能执行规则,例如get会话(). get议程(). getAgendaGroup(“默认”). setFocus();

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

规则将被执行,如果你

  1. 删除规则流组(最新文档提升议程组)
  2. 将自动对焦true添加到规则中
  3. 10秒后设置议程组焦点

查看议程组的工作方式

 类似资料:
  • 我正在使用Drools 6.3.0决赛。假设我有这样的规则 让我们进一步假设我用这个规则构建了KieSession,添加了一些事实,现在我想知道所有规则/所有与我的事实匹配的规则中使用的标识符。 所以我想在这里得到的是$人和$孩子。 我知道我可以获取使用AgendaEventListener触发的规则,从事件中我可以获取规则的名称,以及$person和$child的对象。但我没有找到从匹配中获取标

  • 问题内容: 我有以下输入, 我想提取所有输入, 除了 包含“ ”的行和包含单个(点)的最后一行。也就是说,我想提取以下内容 我尝试了以下方法 但它不起作用,因为它不会产生任何输出。 问题答案: 实际操作: 别忘了负前瞻,否则您将无法获得任何匹配;-)

  • 默认情况下,Fiddler 使用缓冲模式 (Buffering Mode) 操作绝大多数响应。在缓冲模式中,Fiddler 会在数据返回客户端之前完全的缓冲 HTTP(S) 响应。这让 Fiddler 用户可以在客户端接收到响应之前有机会修改响应。 流模式中,Fiddler 一旦从远程服务器拿到响应,会立即返回响应给客户端。这对较低网络时间设定来说是非常重要的,因为多数 Web 浏览器 (IE、F

  • 问题内容: 我需要流式传输在运行时生成的PCM数据。所以我有一个带有循环的线程 不幸的是,这不起作用。似乎这并不取决于AudioTrack缓冲区的大小。我希望它很小以模拟某种低延迟行为(150毫秒),以便用户可以动态更改getPCM()选择的PCM。 但是,我试图将缓冲区大小增加到100k,但没有结果 问题答案: 这是对我有用的简短示例:

  • 我正在了解Confluent的模式注册表,以满足所有模式管理需求。 我不太理解他们的版本控制方法...有一个的概念,我将其视为一个名称空间。据我所知,subject在模式注册表中必须是唯一。 然后是模式id,或者只是,它也是唯一的。 最后,还有一个。 以下是文档中的片段: :此主题的架构版本,每个主题从1开始 :全局唯一的架构版本id,在所有主题中的所有架构中都是唯一的 因此,一旦我想修改特定主题

  • Redis streams是否受益于群集模式?假设您有10个流,它们是分布在集群中还是全部分布在同一个节点上?我计划使用Redis streams实现真正的高吞吐量(每秒200万条消息),因此我担心Redis streams在这种规模下的性能。 如果Redis streams不能在集群模式下进行开箱即用的扩展,那么任何关于水平扩展Redis streams的指导都会非常棒。