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

#java #drools #kie-workbench #drools-kie-server

#java #пускает слюни #kie-workbench #drools-kie-server

Вопрос:

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

Я попытался вставить факт с помощью 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
 

Ответ №1:

Я только что нашел способ получить факты из 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.

Ответ №2:

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

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

Комментарии:

1. Спасибо, getObjects это именно то, что мне нужно. Тем не менее, мы собираемся использовать StatelessKieSessions здесь. Вы действительно привели меня в правильном направлении, чтобы найти подходящий ответ через StatelessKieSession. Спасибо!

Ответ №3:

В моем случае просто ksession.execute(myPojoObject) сработало.

Но убедитесь, что структура пакета myPojoObject в приложении соответствует структуре развернутого kJar (через kie-workbench).