在我的规则执行过程中,我将在内存中"插入"新的事实对象,当规则完成触发时,我需要读取这些对象。在规则会话之外,我如何阅读这些事实?
我试图从会话外部(即在"fireAllRules(("方法之前(插入带有outIdentifier的事实。但是,由于我可能不知道在规则会话期间可能会插入多少会计期间事实,或者即使会插入,因此此方法似乎不合适。
会计期间事实:
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
我刚刚找到了一种从无状态的 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"
,在这种情况下(,我们可以通过使用 KieSession 结果的getValue(outIdentifier)
来获取其返回值。
我看到几个选项。
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(您可以使用KieSession
而不是使用StatelessKieSession
。 KieSession
getObjects
方法,您可以在其中找到插入的所有对象并循环访问它们。
就我而言,ksession.execute(myPojoObject)
工作。
但请确保应用程序中myPojoObject
的包结构与已部署kJar
的包结构相对应(通过 kie-workbench(。