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