如何读取插入 KieSession 内部的 KieSession 外部的事实(例如规则结果)?
How can I read facts outside of the KieSession that were inserted inside of the KieSession (e.g. rules results)?
在我的规则执行期间,我将 "inserting" 新事实 object 存储在内存中,当规则触发时我需要阅读这些信息。我如何在规则之外阅读这些事实 Session?
我试图从 session 外部(即 "fireAllRules()" 方法之前)插入带有 outIdentifier 的事实。但是,因为我可能不知道在规则中可以插入多少AccountingPeriod事实session,或者即使它会被插入,这种方法似乎也不合适。
会计期间事实:
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) 从一开始再插入一个对象到session中作为结果容器
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
方法,您可以在其中找到所有插入的对象并遍历它们。
我刚刚找到了一种从无状态 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)
获取其 return 值。
在我的例子中 ksession.execute(myPojoObject)
有效。
但要确保应用程序中 myPojoObject
的包结构与部署的 kJar
对应(通过 kie-workbench)。
在我的规则执行期间,我将 "inserting" 新事实 object 存储在内存中,当规则触发时我需要阅读这些信息。我如何在规则之外阅读这些事实 Session?
我试图从 session 外部(即 "fireAllRules()" 方法之前)插入带有 outIdentifier 的事实。但是,因为我可能不知道在规则中可以插入多少AccountingPeriod事实session,或者即使它会被插入,这种方法似乎也不合适。
会计期间事实:
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) 从一开始再插入一个对象到session中作为结果容器
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
方法,您可以在其中找到所有插入的对象并遍历它们。
我刚刚找到了一种从无状态 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)
获取其 return 值。
在我的例子中 ksession.execute(myPojoObject)
有效。
但要确保应用程序中 myPojoObject
的包结构与部署的 kJar
对应(通过 kie-workbench)。