具有累积功能的流口水事件序列
Drools sequence of events with accumulate function
我想为以下用例建立规则:
我期待两个 "AddToCart" 事件,然后是 "Search" 事件,完全按照描述的顺序进行。
P.S。这不是真正的业务用例。
目前,我正在尝试使用以下规则实现解决方案:
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
此规则无法正常工作,因为事件顺序未正确定义:
搜索 -> 添加到购物车 -> 添加到购物车 = 操作
我只想要严格的顺序:
添加到购物车 -> 添加到购物车 -> 搜索 = 操作
如果您的规则涉及一小组模式(在本例中为 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
希望对您有所帮助,
我想为以下用例建立规则: 我期待两个 "AddToCart" 事件,然后是 "Search" 事件,完全按照描述的顺序进行。 P.S。这不是真正的业务用例。
目前,我正在尝试使用以下规则实现解决方案:
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
此规则无法正常工作,因为事件顺序未正确定义: 搜索 -> 添加到购物车 -> 添加到购物车 = 操作
我只想要严格的顺序: 添加到购物车 -> 添加到购物车 -> 搜索 = 操作
如果您的规则涉及一小组模式(在本例中为 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
希望对您有所帮助,