在Drools中坚持知识会话

时间:2016-03-17 07:46:25

标签: jpa persistence marshalling drools unmarshalling

目标:我希望在再次为解雇规则创建后继续/重新使用drools知识会话。

问题:我想使用超过1万条规则的决策表创建知识会话。创建此会话并每次都将其丢弃是不可行的,我希望存储一旦创建的会话,该会话可以通过密钥识别并反复重复使用该会话。 我已经尝试了drools的jpa知识服务和kie的编组,但两者都没有奏效。它需要一个知识库实例,并且每次使用drools表创建一个知识库的新实例对我的用例来说是不可取的,因为它需要相当长的时间。如何存储创建的知识库的ID,并在以后使用它来检索此基础?或者如何在没有kbase信息的情况下坚持我的kSession?

编辑:我们有一套规则,我们需要将当前数据与旧数据集进行比较,以确定新数据的参数值。
旧数据集很大,每月只更改一次。目前,我们接近这一点的方法是为旧数据中的每一行设置一条规则。加载速度非常慢,我们必须针对请求执行此操作,并针对当前数据集中的每个条目迭代地触发规则。你给出的解决方案有效。所以现在,我不必一次又一次地加载,这解决了我的目的。但如果我开始考虑它,它似乎不是最好的解决方案 我正在尝试的另一种方法是,在会话中插入旧数据集作为事实,然后保持会话。下次当我加载会话时,我会向我提供事实,我可以用它来解雇我的规则。你认为这种方法更好吗?还有其他建议吗?

1 个答案:

答案 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

不值得坚持;使用任何文件格式的新老人;可能甚至不值得拉链。