目标:我希望在再次为解雇规则创建后继续/重新使用drools知识会话。
问题:我想使用超过1万条规则的决策表创建知识会话。创建此会话并每次都将其丢弃是不可行的,我希望存储一旦创建的会话,该会话可以通过密钥识别并反复重复使用该会话。 我已经尝试了drools的jpa知识服务和kie的编组,但两者都没有奏效。它需要一个知识库实例,并且每次使用drools表创建一个知识库的新实例对我的用例来说是不可取的,因为它需要相当长的时间。如何存储创建的知识库的ID,并在以后使用它来检索此基础?或者如何在没有kbase信息的情况下坚持我的kSession?
编辑:我们有一套规则,我们需要将当前数据与旧数据集进行比较,以确定新数据的参数值。
旧数据集很大,每月只更改一次。目前,我们接近这一点的方法是为旧数据中的每一行设置一条规则。加载速度非常慢,我们必须针对请求执行此操作,并针对当前数据集中的每个条目迭代地触发规则。你给出的解决方案有效。所以现在,我不必一次又一次地加载,这解决了我的目的。但如果我开始考虑它,它似乎不是最好的解决方案
我正在尝试的另一种方法是,在会话中插入旧数据集作为事实,然后保持会话。下次当我加载会话时,我会向我提供事实,我可以用它来解雇我的规则。你认为这种方法更好吗?还有其他建议吗?
答案 0 :(得分:0)
快速启动的一个好方法是将KieBase保存到文件中,并在需要时读取它。
KieBase kieBase = kieContainer.getKieBase();
FileOutputStream fos1 = new FileOutputStream( KBPATH );
ObjectOutputStream oos1 = new ObjectOutputStream( fos1 );
oos1.writeObject( kieBase );
oos1.close();
FileInputStream fis9 = new FileInputStream( KBPATH );
ObjectInputStream ois9 = new ObjectInputStream( fis9 );
KieBase kieBase = (KieBase)ois9.readObject();
KieSession kieSession = kieBase.newKieSession();
(但是,一个包含超过10,000条规则的决策表似乎并不是使用Drools的正确方法。不仅编译速度可能很慢 - 这对插入有何影响?)
稍后根据您已添加到问题中的简单情况,我建议将行数据作为事实插入,然后使用一条规则
rule "update discount"
when
$op: OldPerson( $oloc: location, $oage: age, $odis: discount )
$np: NewPerson( location == $oloc, age == $oage, discount != $odis )
then
modify( $np ){ setDiscount( $odis ) }
end
不值得坚持;使用任何文件格式的新老人;可能甚至不值得拉链。