如何阅读 KieSession 外部插入 KieSession 内部的事实(例如规则结果)?



在我的规则执行过程中,我将在内存中"插入"新的事实对象,当规则完成触发时,我需要读取这些对象。在规则会话之外,我如何阅读这些事实?

我试图从会话外部(即在"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而不是使用StatelessKieSessionKieSession getObjects方法,您可以在其中找到插入的所有对象并循环访问它们。

就我而言,ksession.execute(myPojoObject)工作。

但请确保应用程序中myPojoObject的包结构与已部署kJar的包结构相对应(通过 kie-workbench(。

相关内容

  • 没有找到相关文章

最新更新