3

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

提前致谢 !

4

2 回答 2

1

除了创建时,会话中没有初始状态。当您将 Facts 插入会话时,会评估规则,因此您无法返回评估步骤。也许您可以重构您的用例以使其性能更好,但是如果没有更多关于您的具体情况的知识,很难为您提供帮助。

于 2013-08-02T18:00:03.057 回答
1

我遇到了同样的问题。

是的,如果您创建一个新会话,您将需要重新插入您的新事实。据说创建会话很快,但我还没有被迫运行性能测试(还)。如果您不想重新创建会话,您可以收回插入的事实对象。然后重新插入它们。(请注意,'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 个字符串?或者你指的是大量的订单,暗示你需要每秒多次“重置”知识库?

于 2017-10-16T15:39:00.393 回答