如何防止流口水引擎在入口点数据上循环
how to prevent drools engine looping on entry point data
我正在使用 drools 对流式交易数据发出警报。
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
这些是我测试后得到的结果:
- 来自 msisdn 的交易 msisdn_1:
------------ an alarm on msisdn_1 ----------
- 来自 msisdn 的事务 msisdn_1 再次:
------------ an alarm on msisdn_1 ----------
- 来自 msisdn 的交易 msisdn_2:
------------ an alarm on msisdn_2 ----------
- 来自 msisdn 的事务 msisdn_2 再次:
------------ an alarm on msisdn_2 ----------
- 来自 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
我得到了以下结果和我的预期:
- 来自 msisdn 的交易 msisdn_1:
------------ an alarm on msisdn_1, total Transaction: 1 ----------
(这是预期的)
- 来自 msisdn 的事务 msisdn_1 再次:
------------ an alarm on msisdn_1, total Transaction: 2 ----------
------------ an alarm on msisdn_1, total Transaction: 2 ----------
我期望的是: 单行 ------------ msisdn_1 上的警报,总计交易:2 ----------
- 来自 msisdn 的交易 msisdn_2:
------------ an alarm on msisdn_2, total Transaction: 1 ----------
(符合预期)
- 来自 msisdn 的事务 msisdn_2 再次:
------------ an alarm on msisdn_2, total Transaction: 2 ----------
------------ an alarm on msisdn_2, total Transaction: 2 ----------
我期望的是: 单行 ------------ msisdn_2 上的警报,总计交易:2 ----------
- 来自 msisdn 的交易 msisdn_3:
------------ an alarm on msisdn_3, total Transaction: 1 ----------
(这是预期的)
- 来自 msisdn 的事务 msisdn_3 再次:
------------ an alarm on msisdn_3, total Transaction: 2 ----------
------------ an alarm on msisdn_3, total Transaction: 2 ----------
我期望的是: 单行 ------------ msisdn_3 上的警报,总计交易:2 ----------
- 来自 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 ----------
有人可以向我解释为什么我会得到这些结果吗?
有可能得到我所期望的吗?
谢谢。
因为您的活动仅在 24 小时后过期,所以较早的活动会参与规则逻辑。
通常这可以通过滑动长度 window
来固定
over window:length(1) from entry-point "OM-TRANS"
完整片段
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 ----------
我正在使用 drools 对流式交易数据发出警报。 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
这些是我测试后得到的结果:
- 来自 msisdn 的交易 msisdn_1:
------------ an alarm on msisdn_1 ----------
- 来自 msisdn 的事务 msisdn_1 再次:
------------ an alarm on msisdn_1 ----------
- 来自 msisdn 的交易 msisdn_2:
------------ an alarm on msisdn_2 ----------
- 来自 msisdn 的事务 msisdn_2 再次:
------------ an alarm on msisdn_2 ----------
- 来自 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
我得到了以下结果和我的预期:
- 来自 msisdn 的交易 msisdn_1:
------------ an alarm on msisdn_1, total Transaction: 1 ----------
(这是预期的)
- 来自 msisdn 的事务 msisdn_1 再次:
------------ an alarm on msisdn_1, total Transaction: 2 ----------
------------ an alarm on msisdn_1, total Transaction: 2 ----------
我期望的是: 单行 ------------ msisdn_1 上的警报,总计交易:2 ----------
- 来自 msisdn 的交易 msisdn_2:
------------ an alarm on msisdn_2, total Transaction: 1 ----------
(符合预期)
- 来自 msisdn 的事务 msisdn_2 再次:
------------ an alarm on msisdn_2, total Transaction: 2 ----------
------------ an alarm on msisdn_2, total Transaction: 2 ----------
我期望的是: 单行 ------------ msisdn_2 上的警报,总计交易:2 ----------
- 来自 msisdn 的交易 msisdn_3:
------------ an alarm on msisdn_3, total Transaction: 1 ----------
(这是预期的)
- 来自 msisdn 的事务 msisdn_3 再次:
------------ an alarm on msisdn_3, total Transaction: 2 ----------
------------ an alarm on msisdn_3, total Transaction: 2 ----------
我期望的是: 单行 ------------ msisdn_3 上的警报,总计交易:2 ----------
- 来自 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 ----------
有人可以向我解释为什么我会得到这些结果吗? 有可能得到我所期望的吗? 谢谢。
因为您的活动仅在 24 小时后过期,所以较早的活动会参与规则逻辑。
通常这可以通过滑动长度 window
over window:length(1) from entry-point "OM-TRANS"
完整片段
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 ----------