我正在使用Drools 6.3.0 Final。假设我有这样的规则
android:layout_width="match_parent"
android:layout_height="100dp"
android:id="@+id/map"
tools:context=".MapsActivity"
android:name="com.google.android.gms.maps.SupportMapFragment"
/>
让我们进一步假设我使用此规则构建我的KieSession,添加一些事实,现在我想知道所有规则中使用的标识符/所有符合我事实的规则。
所以我想要的是$ person和$ child。
我知道我可以获得使用AgendaEventListener触发的规则,从事件中我可以得到规则的名称,以及$ person和$ child的对象。但我找不到从我的匹配中获取标识符$ person和$ child的方法。使用调试器我可以看到信息在那里......实际上我从事件中得到的规则是一个RuleImpl,它有一个lhsRoot,在其中我可以找到那些信息......但这听起来要比它应该复杂得多是和不是预期的方式。
所以我想知道是否有更好的方法。
答案 0 :(得分: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对象。
希望它有所帮助,