在规则执行期间,我将在内存中“插入”新的事实对象,当规则触发完成时,我需要读取这些对象。在规则课程之外,我如何阅读这些事实?
我尝试过从会话外部(即在“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
在我的情况下,只需执行会话。执行(myPojoObject)工作正常。
但是要确保应用程序中myPojoObject
的包结构与部署的kJar
的包结构相对应(通过kie-workbench)。
我看到了几个选择。
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
而不是使用KieSession
。KieSession
具有getObject
方法,您可以在其中找到所有插入的对象并遍历它们。
我刚刚找到了一种从无状态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上进行查找。我将接收不同用户的数据,