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();
你说你有“大量的事实”。多大? (在我的玩具“帐户”对象中,我有一个字符串和一个整数)。 100个BigDecimal字段? 100,000弦?或者你指的是大量的订单,这意味着你需要每秒钟多次“重置”知识库?
为什么不只是创建一个新的呢? :) –
我有大量的事实。如果我创建一个新的知识会话,我不需要再次插入事实。在我的系统中,我创建了一次有状态的知识会议,并启动所有规则,获得结果。对于下一个操作,我需要知识会话处于初始状态。 – Viraj
在我看来,你可能会改变你的设计,以利用无状态会话。不是将事实插入会话,而是创建一个列表来存储事实。然后,您可以重用您的事实列表,让Statless会话执行。 –