org.drools.compiler.lang.apiで提供されているRuleDescrBuilder APIを使用して作成したDrLファイルで、次の構造を使用しています。Drools:AfterMatchFiringEventがOR条件付きの同じルールに対して複数回トリガーしていますか?
私は、バックエンドの各ルールのヒット数を追跡するために、後のイベントをトリガーします。ただし、入力(述語)がRule1のすべての条件に一致すると、1つの入力に対して複数のafterMatchFiredEventsがトリガーされます。
import com.objects.Predicate
global com.Util policyUtil
dialect "java"
rule "Rule1:RuleId"
salience 2147483647
when
predicate := Predicate()
(
eval(policyUtil.evaluate(condition1)) or
eval(policyUtil.evaluate(condition2)) or
eval(policyUtil.evaluate(condition3))
then
...
end
rule "defaultRule:defaultRule"
salience 0
when
predicate := Predicate()
then
predicate.setValue1("default1");
predicate.setValue2("Default2");
drools.halt();
end
これは一致イベントトリガの後です:
public void afterMatchFired(AfterMatchFiredEvent event) {
logger.info("Matching rule Name:: " + event.getMatch().getRule().getName());
updateHitCountForRule(event.getMatch().getRule().getName());
}
これはruledescbuilderが使用されている方法です。
RuleDescrBuilder rdb = pdb.newRule();
CEDescrBuilder<?, ?> cedb = rdb.lhs();
cedb = cedb.and();
for(each condition in rule)
cedb.eval().constraint(constraint).end();
Q:afterMatchFireがOR条件付きの同じルールに対して何度もトリガーされるのはなぜですか?私はevalが正しく使用されていないと仮定しています。 evalが正しく使用されない場合、上記の方法を使用してこの種のルールセットを構築する正しい方法は何ですか?
ありがとうエステバン。 OR条件をEVAL(policyUtil.evaluate(condition1)|| policyUtil.evaluate(condition2)..)の形で1つのEVAL内で実行しました。これにより、ただ1つのイベントが発生し、期待どおりに動作しました。 – Shashank