Pendant l'exécution de mes règles, j'insérerai en mémoire un nouvel objet factuel que j'aurai besoin de lire lorsque les règles auront fini de tirer. Comment puis-je lire ces faits en dehors de la session de règles?
J'ai essayé d'insérer le fait avec un outIdentifier, depuis l'extérieur de la session (c'est-à-dire avant la méthode "fireAllRules ()"). Cependant, comme il se peut que je ne sache pas combien de faits AccountingPeriod peuvent être insérés pendant la session de règles, ou même s'ils seront insérés, cette méthode ne semble pas appropriée.
Account Period Fact:
XXX
Code d'exécution:
rule when [some condition] then insert (new AccountingPeriod(LocalDate.of(year, month, day), 100)); end
myRules.drl
sample.package; public static void main(String args[]) { StatelessKieSession ksession = [initialized KieSession] ksession.execute(Arrays.asList(Facts[])); [Code here to get the AccountingPeriod fact inserted in the rule session] }
3 Réponses :
Je vois plusieurs options.
1) Insérez un objet supplémentaire dans la session depuis le tout début et utilisez-le comme conteneur de résultats.
Person person = new Person(); person.setAge(15); List result = new ArrayList(); kieSession.execute(Arrays.asList(person,result)); assertThat(result.get(0)).isEqualTo("haha"); rule "Check person age" when $person : Person( age > 16 ); $result : List ( ); then insert(new IsCoder( $person ) ); $result.add("haha"); end
2) Au lieu d'utiliser StatelessKieSession
vous pouvez utiliser uniquement KieSession
. KieSession
a la méthode getObjects
dans laquelle vous pouvez trouver tous les objets insérés et les parcourir.
Merci, getObjects
est exactement ce dont j'ai besoin. Cependant, nous allons utiliser StatelessKieSessions ici. Vous m'avez conduit dans la bonne direction pour trouver la réponse appropriée à travers une StatelessKieSession. Merci!
Je viens de trouver un moyen d'obtenir les faits d'une KieSession sans état.
sample.package; public static void main(String args[]) { StatelessKieSession ksession = [initialized KieSession] List<Command> cmds = new ArrayList<>(); cmds.add([all required commands]); cmds.add(CommandFactory.newFireAllRules()); cmds.add(CommandFactory.newGetObjects("facts")); ExecutionResults rulesResults = kSession.execute(CommandFactory.newBatchExecution(cmds)); Collection<Object> results = (Collection<Object>) rulesResults.getValue("facts"); }
Il s'avère qu'en liant une commande à un OutIdentifier ( "facts"
, dans ce cas) nous pouvons obtenir sa valeur de retour en utilisant le getValue (outIdentifier)
des résultats de KieSession.
Dans mon cas, ksession.execute (myPojoObject)
a simplement fonctionné.
Mais assurez-vous que la structure du package de myPojoObject
dans l'application correspond à celle du kJar
déployé (via kie-workbench).