Drools 6.5使用自定义议程筛选器执行特定规则无效
我需要使用关联的值来执行特定的规则,并尝试实现一个自定义议程过滤器,一次只执行一个特定的规则,但它似乎执行所有规则。我使用的是一个无状态会话,定义如下:Drools 6.5使用自定义议程筛选器执行特定规则无效,drools,kie,Drools,Kie,我需要使用关联的值来执行特定的规则,并尝试实现一个自定义议程过滤器,一次只执行一个特定的规则,但它似乎执行所有规则。我使用的是一个无状态会话,定义如下: @Bean @ConditionalOnMissingBean(KieSession.class) public StatelessKieSession kieSession() throws IOException { return kieContainer().newStatelessKie
@Bean
@ConditionalOnMissingBean(KieSession.class)
public StatelessKieSession kieSession() throws IOException {
return kieContainer().newStatelessKieSession();
}
import lombok.extern.slf4j.Slf4j;
import org.kie.api.runtime.rule.AgendaFilter;
import org.kie.api.runtime.rule.Match;
@Slf4j
public class RuleNameEqualsAgendaFilter implements AgendaFilter {
private final String ruleName;
private final boolean accept;
public RuleNameEqualsAgendaFilter(final String name) {
this(name, true);
}
public RuleNameEqualsAgendaFilter(final String name, final boolean accept) {
this.ruleName = name;
this.accept = accept;
}
public String getName() {
return ruleName;
}
public boolean isAccept() {
return accept;
}
public boolean accept( Match match) {
log.debug("Comparing : " + match.getRule().getName() + " to ruleName : " + this.ruleName);
if (match.getRule().getName().equals(this.ruleName)) {
return this.accept;
} else {
return !this.accept;
}
}
}
我迭代映射并执行每个规则的逻辑如下:
for (Map.Entry<Long, String> entry : ruleIdsAndData.entrySet()){
List<Object> facts = new ArrayList<Object>();
facts.add(entry.getValue());
Map<String, String> ruleResponse = new HashMap<String, String>();
kieSession.setGlobal("ruleResponse", ruleResponse);
TrackingAgendaEventListener agendaEventListener = new TrackingAgendaEventListener();
kieSession.addEventListener(agendaEventListener);
String ruleName = myRuleService.retrieveRuleNameById(entry.getKey());
log.debug("Attempting to fire the following rule : " + ruleName);
facts.add(new FireAllRulesCommand(new RuleNameEqualsAgendaFilter(ruleName)));
kieSession.execute(facts);
log.debug("RuleResponse after rule has fired is : " + ruleResponse);
}
您知道为什么这会执行与我在
ruleName
中指定的规则不同的规则吗?这里您正在向列表中添加事实:
List<Object> facts = new ArrayList<Object>();
facts.add(entry.getValue());
然后你打电话
kieSession.execute(facts);
插入所有事实,然后调用fireAllRules。所以代理过滤器只是WM中的一个事实
使用状态会话,插入事实并调用fireAllRules,并将AgendaFilter作为参数。为什么说每次调用都会执行所有规则?如果我将规则名硬编码到下一行,控制台输出将显示另一个规则名:facts.add(new FireAllRulesCommand)(new RuleNameEqualAgendaFilter(“myHardCodedRuleName”);我想知道上面的配置是否正确,或者我应该传递一个命令列表&使用CommandFactory.newBatchExecution…谁在创建这些日志?TrackingGendaEventListener在做什么?请将此、控制台输出以及如何生成控制台输出编辑到您的问题中。-日志行”比较:。。。“应该对所有匹配规则可见。我的应用程序正在本地生成控制台输出,而TrackingGendaEventListener当前未使用。我看不到任何“比较…”行的日志记录。。。。。“这是我添加到RuleNameequalAgendaFiltergreat中的,谢谢,当我使用statefulSession时,它现在正在激活议程过滤器,以便我可以查看正确的日志记录。如果我有两条规则,只有一条执行,而另一条不执行,那么我希望2条规则执行。如果多次调用session.insert或session.fireAllRules(…),将会话更改为statefulSession不会导致仅执行1条规则?当我将第二条规则名传递给议程筛选器时,它不会记录,但第一条规则会记录,因此我的第一条规则会被执行,但第二条规则不确定我是否理解这些注释。-注意,您必须在调用fireAllRules之前和之后重新创建和处理有状态会话,以获得与无状态会话相同的结果。我需要迭代一个映射或一批规则,并单独执行每个规则及其关联值。在将无状态会话更改为有状态会话后,议程筛选器在第一条规则中运行了一次,但在第二条规则中没有运行。对于第一条规则,我只能看到一条日志语句“比较…”。有什么理由我会看到这种行为吗?另外,我在启动时从数据库将规则加载到会话中,因此每次我要执行规则时都无法重新创建会话。
kieSession.execute(facts);