现在,在我的流口水项目中,我在单独的DRL文件中有两组规则,这些规则由议程组划分。对于议程组“ preCheck”,我将该议程组中的每个规则的自动焦点设置为true。例:
rule "preCheckDuplicate"
agenda-group "preCheck"
auto-focus true
no-loop true
salience 50
when
$f : IngestFileMetadata(isDuplicate.equalsIgnoreCase("True"))
then
$f.setIsDuplicate("True");
end
对于另一个议程组-“ defaultRules”-规则未设置自动聚焦属性。例:
rule "duplicate file default"
agenda-group "defaultRules"
activation-group "isDuplicate"
no-loop true
salience 0
when
$f : IngestFileMetadata(isDuplicate.equals("True"))
then
insert(createResponse($f));
end
通过rest API调用规则时,我还尝试通过JSON有效负载将焦点设置为“ preCheck”议程组。例:
{
"lookup": "defaultStatelessKieSession",
"set-focus": "preCheck",
"commands": [
{
"insert": {
"out-identifier": "IngestFileMetadata",
"return-object": "true",
"entry-point": "DEFAULT",
"object": {
"com.hms.ingestion.rules.IngestFileMetadata": {
* * * * * data attributes here * * * * *
}
}
}
},
{
"fire-all-rules": {"out-identifier": "fired"}
},
{
"query": {"name": "rulesResponses", "out-identifier": "rulesResponses"}
}
]
}
但是,执行规则时,似乎首先评估了“ defaultRules”议程组中的规则。我不知道为什么。我对流口水还比较陌生,因此很可能我没有正确理解议程组的概念,但是我确信此设计将确保“ preCheck”规则将首先进行评估。
谁能提供任何见解,说明为什么这种情况没有发生?如果需要提供更多详细信息,我可以。
提前致谢。
最佳答案
通过议程组,您可以将规则放入组中,并将这些组放入堆栈中。的
堆栈具有推/弹出行为。
在首先讨论如何使用议程组之前,我想说的是,配置议程组取决于您在规则引擎中使用的KieSession
类型。对于有状态会话,您可以通过调用ksession.getAgenda().getAgendaGroup( "preCheck" ).setFocus();
直接配置它。
对于无状态会话,您必须声明一个显式规则以将会话焦点设置为特定的Agenda
。您可以使用以下规则在Stateless Session
中设置议程:
rule "global"
salience 100
when
$f : IngestFileMetadata()
then
drools.setFocus($f.getAgenda());
end
注意:您必须找到某种方法来在规则文件中获取议程变量。在上面的示例中,getAgenda()是IngestFileMetadata类中的方法,它返回String类型的议程值。