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

问题描述:

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

在此先感谢!

+0

为什么不只是创建一个新的呢? :) –

+0

我有大量的事实。如果我创建一个新的知识会话,我不需要再次插入事实。在我的系统中,我创建了一次有状态的知识会议,并启动所有规则,获得结果。对于下一个操作,我需要知识会话处于初始状态。 – Viraj

+0

在我看来,你可能会改变你的设计,以利用无状态会话。不是将事实插入会话,而是创建一个列表来存储事实。然后,您可以重用您的事实列表,让Statless会话执行。 –

除了创建时,会话中没有初始状态。将事实插入会话中时,会对规则进行评估,因此无法重新进入评估步骤。 也许你可以重构你的用例,让它更好地发挥作用,但是如果没有更多关于你的具体情况的知识是很难帮助你的。

+0

我试图开发一个非常基本的订单处理系统。逻辑是用drools写的。当请求到达时,系统应该评估规则并给出结果(例如:订单是否有效等)。在这个规则评估过程中事实发生了变化。 (例如:有效性,价格等设置为仅与该特定请求相关的事实)。当另一个请求到达时,我需要事实处于初始状态,因为规则是这样写的,即修改后的对象对某些规则不再有效。续。 – Viraj

+0

例如,如果设置了某个属性(例如产品价格),则不会评估该产品的价格。我通过编写另一条规则将事实改变为初始状态。但我在想如果规则引擎支持恢复到以前的状态。但根据你对规则评估的解释,实际上插入时我明白这是不可能的。 – Viraj

我遇到了同样的问题。

是的,如果你创建一个新的会话,你将需要重新插入新的事实。 假设创建会话很快,但我没有*运行性能测试(还)。如果您不想重新创建会话,则可以撤消插入的事实对象。然后重新插入它们。 (请注意,'收回'方法已被弃用,以'删除'为准)。所以我对我的玩具问题的代码看起来像这样(我“复位”会议三次):

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弦?或者你指的是大量的订单,这意味着你需要每秒钟多次“重置”知识库?