有没有办法将规则引擎(有状态)恢复到初始状态(插入所有规则和事实并且未触发fireAllRules()的状态)?
提前致谢!
答案 0 :(得分:1)
除了创建时,会话中没有初始状态。将Facts插入会话时,将评估规则,因此您无法返回评估步骤。 也许你可以重构你的用例以使其表现更好,但是如果不了解你的具体情况就很难帮助你。
答案 1 :(得分:0)
我遇到了同样的问题。
是的,如果您创建新会话,则需要重新插入新事实。 据说创建会话很快,但我还没有被迫进行性能测试。如果您不想重新创建会话,则只需缩回插入的事实对象即可。然后重新插入它们。 (请注意,'retract'方法已被弃用,支持'delete')。所以我的玩具问题代码看起来像这样(我“重置”了三次会话):
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();
你说你有“大量的事实”。大到多大? (在我的玩具“帐户”对象中,我有一个字符串和一个整数)。 100 BigDecimal字段? 100,000个字符串?或者您指的是大量订单,这意味着您需要每秒多次“重置”知识库?