J'ai besoin d'exécuter des règles spécifiques en utilisant leurs valeurs associées et j'ai essayé d'implémenter un filtre d'agenda personnalisé pour exécuter une seule règle à la fois mais il semble exécuter toutes les règles. règles. J'utilise une session sans état que je définis comme ceci:Drools 6.5 Exécution d'une règle spécifique à l'aide d'un filtre d'agenda personnalisé
@Bean
@ConditionalOnMissingBean(KieSession.class)
public StatelessKieSession kieSession() throws IOException {
return kieContainer().newStatelessKieSession();
}
Ma logique pour itérer la carte et l'exécution de chaque règle est la suivante:
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);
}
et la classe RuleNameEqualsAgendaFilter
ressemble à ceci:
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;
}
}
}
Des idées pourquoi cela exécuterait une règle différente de celle que je spécifie dans ruleName
?
Qu'est-ce qui vous fait dire que toutes les règles sont exécutées avec chaque appel à exécuter? – laune
si je hardcode my ruleName dans la ligne suivante, la sortie de la console affiche un autre ruleName: facts.add (new FireAllRulesCommand (new RuleNameEqualsAgendaFilter ("myHardCodedRuleName"))); Je me demande si la configuration ci-dessus est OK ou devrais-je passer une liste de commandes et utiliser CommandFactory.newBatchExecution .... – Orby
Qui crée ces journaux? Que fait 'TrackingAgendaEventListener'? –