使用累积功能降低事件序列

时间:2016-09-07 18:45:33

标签: conditional-statements drools accumulate

我想为以下用例构建规则: 我期待两个“AddToCart”事件,然后是“搜索”事件,完全按照描述的顺序。 附:这不是一个真正的商业用例。

目前,我正在尝试使用以下规则来实现解决方案:

rule "Rule-102"
salience 1000110000
    agenda-group "level0"
    dialect "mvel"
    when
         Number(doubleValue >= 2) from accumulate ($event1: Event(eval($event1.getName().equals('AddToCart'))),count($event1));$event: Event()
         $event2: Event(eval($event2.getName().equals('Search')), this after $event)
    then
        sendEvent($event2, ed, drools);
end

此规则无法正常工作,因为事件序列未正确定义: 搜索 - > AddToShoppingCart - > AddToShoppingCart = Action

我只想要严格的顺序: AddToShoppingCart - > AddToShoppingCart - >搜索=操作

1 个答案:

答案 0 :(得分:2)

如果您的规则涉及一小组模式(在这种情况下,2 AddToCart和1 Search),您可以尝试这样的事情:

rule "Rule-102"
when
    $e1: Event(name == "AddToCart")
    $e2: Event(name == "AddToCart", timestamp > $e1.timestamp)
    $s1: Event(name == "Search", timestamp > $e2.timestamp)
then
    sendEvent($s1, ed, drools);
end

尽管很优雅,但这个解决方案存在一些潜在的问题:

  • 如果您想使用更多AddToCart个活动,则无法很好地扩展。
  • 如果您有3个(或更多)AddToCart个事件,此规则将多次触发(我不确定这是否是您用例中所需的行为)

如果你想使用更通用的方法,你可以尝试这些方法:

rule "Rule-102"
when
    $s1: Event(name == "Search")
    Number(intValue >= 2) from accumulate(
        Event(name == "AddToCart", timestamp < $s1.timestamp),
        count(1)
    )
then
    sendEvent($s1, ed, drools);
end

希望它有所帮助,