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);