Как я могу прочитать факты вне KieSession, которые были вставлены в KieSession (например, результаты правил)? - PullRequest
0 голосов
/ 15 апреля 2019

Во время выполнения моих правил я буду «вставлять» в память новый объект факта, который мне нужно будет прочитать, когда правила будут выполнены. Как я могу прочитать эти факты вне сеанса правил?

Я попытался вставить факт с помощью outIdentifier вне сеанса (т. Е. До метода "fireAllRules ()"). Однако, поскольку я могу не знать, сколько фактов AccountingPeriod может быть вставлено во время сеанса правила, или даже если он будет вставлен, этот метод не подходит.

Факт учетного периода:

package sample.package;

public class AccountingPeriod {

    private LocalDate accountingDate;
    private int personKey;

    public AccountingPeriod(LocalDate accountingDate, int personKey) {
        this.accountingDate = accountingDate;
        this.personKey = personKey;
    }

    public LocalDate getAccountingDate() { return accountingDate; }
    public LocalDate getPersonKey() { return personKey; }
}

Код исполнения:

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

myRules.drl

rule
    when [some condition]
    then
        insert (new AccountingPeriod(LocalDate.of(year, month, day), 100));
end

Ответы [ 2 ]

1 голос
/ 16 апреля 2019

Я только что нашел способ получить факты из KieSession без состояния.

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

Оказывается, что, связав команду с OutIdentifier (в данном случае "facts"), мы можем получить ее возвращаемое значение, используя getValue(outIdentifier) результатов KieSession.

1 голос
/ 15 апреля 2019

вижу несколько вариантов.

1) Вставить еще один объект в сессию с самого начала и использовать его в качестве контейнера результатов.

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) Вместо использования StatelessKieSession вы можете использовать только KieSession. KieSession имеет getObjects метод, в котором вы можете найти все вставленные объекты и перебрать их.

...