首页 文章

Drools:从LHS模式中获取标识符

提问于
浏览
0

我正在使用Drools 6.3.0 Final . 假设我有这样的规则

rule "Child of Person over 18"
when
    $person : Person(age > 18)
    $child : from $person.children
then
end

让我们进一步假设我使用此规则构建我的KieSession,添加一些事实,现在我想知道所有规则中使用的标识符/符合我的事实的所有规则 .

所以我想要的是$ person和$ child .

我知道我可以使用AgendaEventListener获取规则,并且从事件中我可以获取规则的名称,以及$ person和$ child的对象 . 但我找不到从我的比赛中获取标识符$ person和$ child的方法 . 使用调试器我可以看到信息在那里......实际上我从事件得到的规则是一个RuleImpl,它有一个lhsRoot,我可以在其中找到那些信息...但这听起来要比它应该复杂得多是和不是预期的方式 .

所以我想知道是否有更好的方法 .

1 回答

  • 2

    使用Drools的公共API可以轻松实现您的要求 . 你正在寻找合适的地方(AgendaEventListener),但 Match.getObjects() 不是你需要的 . 你需要的是 Match.getDeclarationIds() (获取标识符列表)和 Match.getDeclarationValue(String id) (获取每个标识符的值)的组合 . 例如,这是在控制台中记录此信息的AgendaEventListener的外观如下所示:

    import org.kie.api.event.rule.BeforeMatchFiredEvent;
    import org.kie.api.event.rule.DefaultAgendaEventListener;
    
    ...
    
    ksession.addEventListener(new DefaultAgendaEventListener() {
    
        @Override
        public void beforeMatchFired(BeforeMatchFiredEvent event) {
    
            String ruleName = event.getMatch().getRule().getName();
            List<String> declarationIds = event.getMatch().getDeclarationIds();
    
            System.out.println("\n\n\tRule: "+ruleName);
    
            for (String declarationId : declarationIds) {
                Object declarationValue = event.getMatch().getDeclarationValue(declarationId);
    
                System.out.println("\t\tId: "+declarationId);
                System.out.println("\t\tValue: "+declarationValue);
            }
            System.out.println("\n\n");
        }
    });
    

    正如@laune所提到的,您还可以获得在规则的RHS中激活规则的匹配实例 . 在这种情况下,可以通过 drools.getMatch() 访问Match对象 .

    希望能帮助到你,

相关问题