Drools-将规则引擎还原为初始状态?

Drools-将规则引擎还原为初始状态?,drools,Drools,有没有办法将规则引擎(stateful)恢复到初始状态(插入所有规则和事实且未触发fireAllRules()的状态) 提前谢谢 除了创建会话时,会话中没有初始状态。在会话中插入事实时,将对规则进行评估,因此无法返回评估步骤。 也许您可以重构您的用例以使其性能更好,但是如果不了解您的具体情况,就很难帮助您。我遇到了同样的问题 是的,如果创建新会话,则需要重新插入新事实。 据说创建会话很快,但我还没有被迫运行性能测试。如果不想重新创建会话,只需收回插入的事实对象即可。然后重新插入它们。(请注意,“

有没有办法将规则引擎(stateful)恢复到初始状态(插入所有规则和事实且未触发fireAllRules()的状态)


提前谢谢

除了创建会话时,会话中没有初始状态。在会话中插入事实时,将对规则进行评估,因此无法返回评估步骤。
也许您可以重构您的用例以使其性能更好,但是如果不了解您的具体情况,就很难帮助您。

我遇到了同样的问题

是的,如果创建新会话,则需要重新插入新事实。 据说创建会话很快,但我还没有被迫运行性能测试。如果不想重新创建会话,只需收回插入的事实对象即可。然后重新插入它们。(请注意,“retract”方法已被弃用,取而代之的是“delete”)。因此,我的玩具问题代码如下所示(我“重置”会话三次):


你说你有“大量的事实”。有多大?(在我的玩具“Account”对象中,我有一个字符串和一个整数)。100个大的十进制字段?十万串?或者您指的是大量订单,这意味着您需要每秒多次“重置”知识库?

为什么不创建一个新的知识库呢?:)我有大量的事实。如果我创建一个新的知识会话,我不需要再次插入事实。在我的系统中,我创建一次状态完整的知识会话,并触发所有规则,得到结果。对于下一个操作,我需要知识会话处于初始状态。在我看来,您可能会稍微更改您的设计,以使用无状态会话。创建一个列表来存储事实,而不是将事实插入会话。然后,您可以重用事实列表来执行无状态会话。在我的系统中,一些规则依赖于其他规则(使用修改块)。因此,我不能使用无状态会话。是的,您可以使用无状态会话。修改可以在那里使用。我正在尝试开发一个非常基本的订单处理系统。逻辑是用drools编写的。当收到请求时,系统应评估规则并给出结果(例如:订单是否有效等)。在此规则中,评估过程中的事实发生了变化。(例如:有效期、价格等仅与该特定请求相关的事实)。当另一个请求到来时,我需要事实处于初始状态,因为规则的编写方式使得修改后的对象对于某些规则不再有效。续:例如,如果设置了某些属性,例如产品的价格,则该产品的价格不会被评估。我写了另一条规则来改变事实的初始状态。但我在想,如果规则引擎支持恢复到以前的状态。但根据您在“事实插入”时对规则评估的解释,我理解这是不可能的。
System.out.println("--Load the knowledge base with rules.--");
KieServices kServices = KieServices.Factory.get();
KieContainer kContainer = kServices.getKieClasspathContainer();
KieSession kSession = kContainer.newKieSession("ksession-rules");
Account account = new Account(200, "Mickey Mouse");
account.withdraw(150);
kSession.insert(account);
int rulesFired = kSession.fireAllRules();
System.out.println("**** Finished first run, fired " + rulesFired + " rule(s).");

 // Reset session/rules by retracting facts
 FactHandle handle = kSession.getFactHandle(account);
 kSession.delete(handle);

 account.deposit(1000);
 kSession.insert(account);
 rulesFired = kSession.fireAllRules();
 System.out.println("**** Finished second run, fired " + rulesFired + " rule(s).");

 //Reset rules again
 handle = kSession.getFactHandle(account);
 kSession.delete(handle);

 account.deposit(10000000);
 kSession.insert(account);
 rulesFired = kSession.fireAllRules();
 System.out.println("**** Finished third run, fired " + rulesFired + " rule(s).");

 kSession.dispose();