我正在从Drools 5.5.0.Final升级到Drools 6.5.0.CR2,我遇到了一个自定义事件监听器的问题,该监听器侦听ObjectInsertedEvents并引用了引发插入的规则的LHS。根据已触发规则的LHS绑定类型,侦听器会更新新插入事实的属性。
在Drools 5中,我们使用扩展DebugWorkingMemoryEventListener并实现了WorkingMemoryEventListener的自定义事件侦听器来完成此操作:
public void objectInserted(ObjectInsertedEvent event) {
Rule firedRule = event.getPropagationContext().getRuleOrigin();
if (firedRule != null) {
PropagationContext pc = event.getPropagationContext();
Tuple tuple = pc.getLeftTupleOrigin();
Map<String, Declaration> declarationsMap = firedRule.getDeclarations();
// Iterate through the LHS variable bindings
for (Map.Entry<String, Declaration> entry : declarationsMap.entrySet()) {
// Get the value, via the handle to the fact in working memory to which the variable is bound
Declaration declaration = entry.getValue();
FactHandle factHandle = tuple.get(declaration);
// Get the object in working memory via the fact handle
Object bindingObj = ss.getObject(factHandle)
// do some other checks, update the inserted object if necessary
}
}
}
在Drools 6中不推荐使用WorkingMemoryEventListener,所以我已经更新到RuleRuntimeEventListener,但看起来我无法再访问触发ObjectInsertedEvent的规则的LHS,只有一些关于规则本身的基本信息(名称,包,元数据)。或者,我可以使用AgendaEventListener和AfterMatchFiredEvent访问已触发规则的LHS,但是1)没有告诉我是否插入了对象,并且2)没有给我一种更新该对象的方法即使我可以确定它是否已插入。
如何使用这些Drools 6 API更改复制Drools 5中的侦听器行为?感谢。
答案 0 :(得分:0)
如果实现BeforeMatchFired,AfterMatchFired和ObjectInsertedEvent,则可以创建在触发规则期间插入的事实集合。 Match对象为您提供规则LHS的所有绑定。所有插入的对象都可用,应在AfterMatchFired事件中处理。
我没有看到任何阻止您将代码移植到6.x的内容,只有适度的额外代码来维护集合。