Drools 6 - 访问ObjectInsertedEvent

时间:2016-09-26 23:36:03

标签: drools event-listener

我正在从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中的侦听器行为?感谢。

1 个答案:

答案 0 :(得分:0)

如果实现BeforeMatchFired,AfterMatchFired和ObjectInsertedEvent,则可以创建在触发规则期间插入的事实集合。 Match对象为您提供规则LHS的所有绑定。所有插入的对象都可用,应在AfterMatchFired事件中处理。

我没有看到任何阻止您将代码移植到6.x的内容,只有适度的额外代码来维护集合。