当我有两个匹配不同事件的规则时,drools中的伪时钟出错

时间:2016-02-07 15:13:01

标签: drools

我想用场景测试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不匹配。为什么呢?

1 个答案:

答案 0 :(得分:1)

您所做的与Drools的CEP(连续事件处理)的假设有些冲突。 STREAM模式意味着事件应按其时间戳的顺序插入,而不管其来源如何。在大跳跃中来回设置伪时钟是另一种混淆引擎的好方法。

不要使用STREAM模式,窗口:时间而忘记会话时钟。

你有包含时间戳的事实,你可以通过参考这些时间标记轻松编写你的规则,使用普通的算术或应用时间操作符(这些只是语法糖来测试long的关系(如在java.lang)值。