【问题标题】:Drools sequence of events with accumulate function具有累积功能的流口水事件序列
【发布时间】:2016-09-07 18:45:32
【问题描述】:

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

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

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 = 操作

我只想要严格的顺序: AddToShoppingCart -> AddToShoppingCart -> Search = Action

【问题讨论】:

    标签: conditional-statements drools accumulate


    【解决方案1】:

    如果您的规则涉及一小组模式(在本例中为 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
    

    希望对你有帮助,

    【讨论】:

    • $event1: Event(eval($event1.getName().equals('AddToCart'))) $event2: Event(eval($event2.getName().equals('AddToCart') ), this after $event1) $event3: Event(eval($event3.getName().equals('Search')), this after $event2)
    猜你喜欢
    • 1970-01-01
    • 2012-09-18
    • 2020-10-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-03-16
    • 2020-11-17
    • 1970-01-01
    相关资源
    最近更新 更多