1
votes

Comment puis-je lire des faits en dehors de KieSession qui ont été insérés à l'intérieur de KieSession (par exemple, les résultats des règles)?

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]
}


0 commentaires

3 Réponses :


1
votes

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.


1 commentaires

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!



2
votes

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.


0 commentaires

0
votes

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


0 commentaires