当前位置: 首页 > 知识库问答 >
问题:

如何读取插入到Kie会话内部的Kie会话之外的事实(例如规则结果)?

宋臻
2023-03-14

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

我尝试过从会话外部(即在“fire All规则()”方法之前)使用outIdfier插入事实。但是,因为我可能不知道在规则会话期间可能会插入多少Account ing周期事实,或者即使它会被插入,这种方法似乎不合适。

会计期间事实:

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

共有3个答案

呼延永新
2023-03-14

在我的情况下,只需执行会话。执行(myPojoObject)工作正常。

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

蓝华皓
2023-03-14

我看到了几个选择。

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而不是使用KieSessionKieSession具有getObject方法,您可以在其中找到所有插入的对象并遍历它们。

马泓
2023-03-14

我刚刚找到了一种从无状态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");
}

事实证明,通过将命令链接到Out标识符(在本例中为“事实”),我们可以通过使用KieSession结果的getValue(outIdfier)来获取其返回值。

 类似资料:
  • 到目前为止,我还不知道在Drools 6.0.0中向正在运行的Kie会话添加规则并仍然将我的事实保存在Kie会话中的最佳方法(意味着以最小的开销)。在Drools 5中,当KBase更改时,K会话会更新,但Drools 6似乎并非如此,因为我的规则不是在KieBase中创建的。有没有一种方法可以在不更换KieFileSystem中的整个KieModules或Jars的情况下做到这一点。我认为应该有

  • “您可以决定创建多个会话...如果出于可伸缩性的原因需要多个会话。”

  • 将我的KieSession序列化为字节[]时,我遇到了一个未实现的情况。我以字节[]格式将规则保存在数据库中。 下面是我用来创建KieSession的一段代码: 我有大约1K个永久事实,当向我的Spring Boot应用程序发出HTTP请求时,我需要复制我的KieSession字节,将其反序列化为KieSession,插入大约1K个临时事件、fireAllRules和dispose。这样,我就可以

  • 几天来,我一直在尝试在Netbeans中运行Drools,但它就是不能像我希望的那样工作。我甚至试着让它作为一个maven项目工作,但效果不太好。我描述了我如何创建这个项目,希望有人能给我一个提示。 首先,我需要它在没有maven的情况下工作,因为我被限制不使用它。但在我把它放到真正的项目中之前,我想测试一下。 所以首先我创建了一个新项目 > drools-compiler-6.4.0。最终的罐子

  • 我正在使用与Kie执行服务器集成的Drools workbench 7.17。我在workbench中创建了一个项目,该项目部署在kie执行服务器上。 我已经在项目的设置中配置了kie-base和kie-会话。将有状态的kie-会话定义为kieSession。我正在使用Kie ServerJavaClient API将事实插入引擎。 我能够在KieSession上进行查找。我将接收不同用户的数据,