【发布时间】:2017-08-08 13:33:38
【问题描述】:
我需要使用关联值执行特定规则,并尝试实现自定义议程过滤器一次只执行一个特定规则,但它似乎执行所有规则。我正在使用我这样定义的无状态会话:
@Bean
@ConditionalOnMissingBean(KieSession.class)
public StatelessKieSession kieSession() throws IOException {
return kieContainer().newStatelessKieSession();
}
我迭代Map并执行每条规则的逻辑如下:
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);
}
RuleNameEqualsAgendaFilter 类看起来像这样:
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;
}
}
}
知道为什么这会执行与我在ruleName 中指定的规则不同的规则吗?
【问题讨论】:
-
是什么让你说每次调用都执行所有规则?
-
如果我将我的 ruleName 硬编码到以下行,控制台输出会显示另一个 ruleName:facts.add(new FireAllRulesCommand(new RuleNameEqualsAgendaFilter("myHardCodedRuleName")));我想知道上面的配置是否可以,或者我应该传递一个命令列表并使用 CommandFactory.newBatchExecution....
-
谁在创建这些日志?
TrackingAgendaEventListener在做什么? -
请在您的问题中编辑此内容、控制台输出和控制台输出的生成方式。 - 日志行“Comparing : ...”应该对所有匹配规则可见。
-
我的应用程序正在本地生成控制台输出,而 TrackingAgendaEventListener 当前未使用。我看不到我添加到 RuleNameEqualsAgendaFilter 的行“比较.....”的任何日志记录