我想用场景测试drools 6.3,但我在特殊情况下遇到问题。 这是我的场景,形式简单: 我在生成事件的模拟网络中有两个系统A和B.我想写两条规则来找出这些事件中的模式。测试此场景的两条规则是:
declare A
@timestamp(timestampA)
end
declare B
@timestamp(timestampB)
end
Rule “1”
When
accumulate( A() over window:time( 10s ) ; s:count(1) ; s>1)
Then
System.out.println( " Rule 1 matched " );
Rule “2”
When
B()
Then
System.out.println( " Rule 2 matched " );
每个事件的时间戳是每个系统在由drools接收并插入工作内存时生成的日志的时间戳。 我正在使用带有伪时钟的STREAM模式,因为来自系统B的事件由于网络拥塞而接收到25分钟的延迟,我应该手动调整会话时钟。会话时钟设置为插入会话的每个事件的时间戳。插入每个事件时,所有规则都会触发。 接收和插入事件的顺序如下所示正确匹配。
Event A received at 10:31:21 – Session clock : 10:31:21 – insert A and fire
Event A received at 10:31:23 - Session clock : 10:31:23 – insert A and fire
Rule 1 matched
Event B received at 10:06:41 - Session clock : 10:06:41 – insert B and fire
Rule 2 matched
但接收和插入事件的顺序如下所示:
Event A received at 10:31:21 – Session clock : 10:31:21 – insert A and fire
Event B received at 10:06:41 - Session clock : 10:06:41 – insert B and fire
Rule 2 matched
Event A received at 10:31:23 - Session clock : 10:31:23 – insert A and fire
当第二个A事件被插入时,过去10个事件中的事件处于工作记忆中,但规则1不匹配。为什么呢?
答案 0 :(得分:1)
您所做的与Drools的CEP(连续事件处理)的假设有些冲突。 STREAM模式意味着事件应按其时间戳的顺序插入,而不管其来源如何。在大跳跃中来回设置伪时钟是另一种混淆引擎的好方法。
不要使用STREAM模式,窗口:时间而忘记会话时钟。
你有包含时间戳的事实,你可以通过参考这些时间标记轻松编写你的规则,使用普通的算术或应用时间操作符(这些只是语法糖来测试long的关系(如在java.lang)值。