我正在尝试编写一个需要了解当前时间的累积函数。 我显然可以使用System.currentTimeMillis(),但用于测试运行带有伪时钟的drools会话,并希望能够测试此函数。
我正在寻找一种方法来获取会话时钟(或者更好的是,知识运行时间),或者从getResult()方法中获取,或者,如果不可能的话,从drools代码本身(在te中的部分),所以我可以将时钟传递给函数
答案 0 :(得分:4)
使用时钟时要小心,因为你可能会有很多惊喜。请注意,在将事实/事件插入会话或使用更新/修改调用进行修改时,将评估约束。这意味着评估约束时的时钟时间可能与触发规则时的时钟时间不同。这就是为什么drools不会将当前时间直接暴露给LHS模式的原因。
话虽如此,这样做的方法是将会话时钟作为事实插入会话并将其绑定为任何其他事实:
rule X
when
$clock : SessionClock()
... your patterns / accumulate / etc ...
then
...
end
答案 1 :(得分:1)
在单元测试期间,我发现将$clock : SessionClock()
添加到when
将导致单元测试无法触发,FWR(可能是因为我将其模拟为SessionPseudoClock
因此不是{ {1}}工作记忆中的事实。)
然而,通过使用SessionClock
drools
实例,我无需条件绑定即可获得会话时钟(Pseudo或real):
e.g。
KnowledgeHelper