1

在我的规则执行期间,我将在内存中“插入”新的事实对象,当规则完成触发时我需要读取它。在规则会议之外,我如何阅读这些事实?

我试图从会话外部(即在“fireAllRules()”方法之前)插入带有 outIdentifier 的事实。但是,因为我可能不知道在规则会话期间可能会插入多少个 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]
}

我的规则.drl

rule
    when [some condition]
    then
        insert (new AccountingPeriod(LocalDate.of(year, month, day), 100));
end
4

3 回答 3

2

我刚刚找到了一种从无状态的 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(在本例中),我们可以通过使用KieSession 结果的"facts"来获取它的返回值。getValue(outIdentifier)

于 2019-04-16T12:58:13.513 回答
1

我看到几个选项。

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 KieSessionKieSessiongetObjects方法,您可以在其中找到所有插入的对象并遍历它们。

于 2019-04-15T15:58:54.390 回答
0

在我的情况下,只是ksession.execute(myPojoObject)工作。

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

于 2019-10-15T13:43:54.507 回答