2

我正在尝试编写一个需要了解当前时间的累积函数。我显然可以使用 System.currentTimeMillis(),但是为了测试我正在运行一个带有伪时钟的 drools 会话,并且希望能够测试这个函数。

我正在寻找一种从 getResult() 方法中获取会话时钟(或者更好的是 KnowledgeRuntime)的方法,或者,如果那不可能,从 drools 代码本身(在 te when 部分中),所以我可以通过时钟功能

4

2 回答 2

4

使用时钟时要小心,因为您可能会遇到很多惊喜。请注意,当事实/事件插入会话或使用更新/修改调用修改时,会评估约束。这意味着评估约束时的时钟时间可能与触发规则时的时钟时间不同。这就是为什么 drools 不会将当前时间直接暴露给 LHS 模式的原因。

话虽如此,这样做的方法是将会话时钟作为事实插入会话并将其绑定为任何其他事实:

rule X
when
    $clock : SessionClock()
    ... your patterns / accumulate / etc  ...
then
    ...
end
于 2012-05-23T19:30:23.317 回答
1

在单元测试期间,我发现添加$clock : SessionClock()towhen会导致单元测试不触发 FWR(可能是因为我将它模拟为 a ,因此在工作内存SessionPseudoClock中没有事实)。SessionClock

drools KnowledgeHelper但是,通过使用实例,我能够在不需要条件绑定的情况下获得会话时钟(伪或真实) :

例如

then
  System.out.println(String.format(
      "It is now %s", 
         new java.util.Date(drools.getWorkingMemory()
                                  .getSessionClock()
                                  .getCurrentTime())
         .toString()));
于 2013-11-22T08:46:03.453 回答