【问题标题】:how to prevent drools engine looping on entry point data如何防止流口水引擎在入口点数据上循环
【发布时间】:2021-08-04 21:08:03
【问题描述】:

我正在使用 drools 对流式交易数据发出警报。 流口水引擎是 STREAM 和 ACTIVE 模式。我还使用入口点 (OM-TRANS) 将数据传输到规则引擎。 我写了一个简单的规则来测试引擎的行为。我得到了一些结果,但我不理解它们,它们不是我所期望的。

这是第一条简单的规则:

rule "My rule"
    no-loop true
    when
        $transaction: TransactionOmDto($msisdn: msisdn) from entry-point "OM-TRANS"
    then
        System.out.println("------------ an alarm on "+$msisdn+" ----------");
    end

这些是我测试后得到的结果:

  1. 来自 msisdn 的交易msisdn_1

------------ an alarm on msisdn_1 ----------

  1. 再次来自 msisdn 的交易msisdn_1

------------ an alarm on msisdn_1 ----------

  1. 来自 msisdn 的交易msisdn_2

------------ an alarm on msisdn_2 ----------

  1. 再次来自 msisdn 的交易msisdn_2

------------ an alarm on msisdn_2 ----------

  1. 来自 msisdn 的交易msisdn_3

------------ an alarm on msisdn_3 ----------

这是规则的第二个版本:

rule "My rule"
    no-loop true
    when
        $transaction: TransactionOmDto($msisdn: msisdn) from entry-point "OM-TRANS"
        $datasTransaction: List() from collect(TransactionOmDto(msisdn == $msisdn) from entry-point "OM-TRANS")
    then
        System.out.println("------------ an alarm on "+$msisdn+", total Transaction: "+$datasTransaction.size()+" ----------");
    end

我得到了以下结果和我的期望:

  1. 来自 msisdn 的交易msisdn_1

------------ an alarm on msisdn_1, total Transaction: 1 ---------- (这是预期的)

  1. 再次来自 msisdn 的交易msisdn_1
------------ an alarm on msisdn_1, total Transaction: 2 ----------
------------ an alarm on msisdn_1, total Transaction: 2 ----------

我的预期是: 一行 ------------ msisdn_1 上的警报,总交易:2 -------- --

  1. 来自 msisdn 的交易msisdn_2

------------ an alarm on msisdn_2, total Transaction: 1 ----------(如预期)

  1. 再次来自 msisdn 的交易msisdn_2
------------ an alarm on msisdn_2, total Transaction: 2 ----------
------------ an alarm on msisdn_2, total Transaction: 2 ----------

我的预期是: 一行 ------------ msisdn_2 上的警报,总交易:2 -------- --

  1. 来自 msisdn 的交易msisdn_3

------------ an alarm on msisdn_3, total Transaction: 1 ---------- (这是预期的)

  1. 再次来自 msisdn 的交易msisdn_3
------------ an alarm on msisdn_3, total Transaction: 2 ----------
------------ an alarm on msisdn_3, total Transaction: 2 ----------

我的预期是: 一行 ------------ msisdn_3 上的警报,总交易:2 -------- --

  1. 再次来自 msisdn 的交易msisdn_3
------------ an alarm on msisdn_3, total Transaction: 3 ----------
------------ an alarm on msisdn_3, total Transaction: 3 ----------
------------ an alarm on msisdn_3, total Transaction: 3 ----------

我的预期是: 一行 ------------ msisdn_3 上的警报,总交易:3 -------- --

有人可以向我解释为什么我得到这些结果吗? 有可能得到我的期望吗? 谢谢你。

【问题讨论】:

  • 您只是想计算警报数量吗?因为除非您将这些事件配置为过期,否则您当前的工作流程最终将耗尽内存,这将另外抛出您的“总数”。
  • 是的,我已将事件配置为过期:declare TransactionOmDto @role(event) @timestamp(date) @expires(24h) end
  • 是的,您可能想使用 Mike 在答案中建议的滑动窗口。 collect(...) from entry-point 正在有效地重播之前的事件。
  • 你好冷冻豌豆的罗迪。我已经测试了迈克的代码。 $datasTransaction 列表的大小始终为 0:------------ an alarm on msisdn_1, total Transaction: 0 ----------
  • 您是要获取从该入口点收到的所有匹配事件的计数曾经,还是只是过去 24 小时窗口中的事件计数?

标签: java spring-boot drools rule-engine entry-point


【解决方案1】:

由于您的事件仅在 24 小时后到期,因此较旧的事件确实参与了规则逻辑。
通常这可以通过滑动长度窗口来修复

 over window:length(1) from entry-point "OM-TRANS"

完整的sn-p

rule "My rule2"
no-loop true
when
    $transaction: TransactionOmDto($msisdn: msisdn) over window:length(1) from entry-point "OM-TRANS"
    $datasTransaction: List() from collect(TransactionOmDto(msisdn == $msisdn) from entry-point "OM-TRANS")
then
    System.out.println("------------ an alarm on "+$msisdn+", total Transaction: "+$datasTransaction.size()+" ----------");
end

输出

------------ an alarm on msisdn_1, total Transaction: 1 ----------
------------ an alarm on msisdn_1, total Transaction: 2 ----------
------------ an alarm on msisdn_1, total Transaction: 3 ----------

【讨论】:

  • 感谢@Mike 的回答。无论我发送多少 TransactionOmDto 对象,$datasTransaction.size() 都会给出 0------------ an alarm on msisdn_1, total Transaction: 0 ----------
  • 我得到了不同的输出,请提供您的规则和场景的完整列表(junit 测试,或测试中的 sn-p)
  • 你好迈克。你说的对。我的规则引擎处于带有实时时钟的 STREAM 模式。我发送给引擎的数据没有正确的日期。一旦更正,我就会得到完全正确的结果。
猜你喜欢
  • 2011-03-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-02-03
相关资源
最近更新 更多