Drools加载会话似乎解雇了规则

时间:2015-12-18 13:38:14

标签: session jpa drools rule-engine kie

我对此感到茫然,似乎无法在文档中找到答案。我观察到以下行为。我有这个规则:

 http://servername/vdir/webservicename.asmx/Methodname?parameter=value

然后我可以将import function util.CSVParser.parse; declare Passenger @role(event) @expires(24h) end rule "Parse and Insert CSV" when CSVReadyEvent( $csv_location : reader ) from entry-point "CSVReadyEntryPoint"; $p : Passenger() from parse($csv_location); then insert( $p ); end 输入我的会话并致电CSVReadyEvent并正确执行。它最终击中了安全点,一切都很酷。

然后我重启我的应用并加载会话,如下所示:

fireAllRules

我从kmodule.xml获取的基础和配置。

现在发生的是,没有调用KieSession loadedKieSession = kieServices.getKieService().getStoreServices().loadKieSession(session.getId(), kieBase, ksConf, kieServices.getEnvironment()); 加载会话会以某种方式触发所有规则。

我不明白解组是如何触发规则执行的,但这显然是错误的。我已经执行了该规则,不应该执行两次。

在测试用例中(我的测试不创建持久会话,因为我只想测试规则)我可以调用fireAllRules()两次,第二次不会触发任何匹配的规则。我不确定出了什么问题,但持久性会话似乎以奇怪的方式加载。或者会话的持续存在并且忘记它已经执行了规则。

有没有人在里面?我非常乐意分享任何代码。

这是我的persistence.xml:

fireAllRules()

谢谢!

2 个答案:

答案 0 :(得分:0)

在一方面使用fireUntilHalt以及使用fireAllRules保存和重新启动会话时,在实模式和STREAM会话中使用事件是一些矛盾的范例。

如果您有活动,我建议您使用API​​在线程中设置和启动(有状态)会话,并在事件(事件)到达时插入。

答案 1 :(得分:0)

在调试,测试和运行内容的痛苦痛苦的痛苦日子里的更新/回答:

  1. 我怀疑我的hibernate设置是错误的,所以错误的东西得到了坚持。我最终抛弃了这种方法并编写了一个手动编组/去编组的东西。
  2. 创建/加载/重新创建/加载后,我可以确认会话永远不会对文件进行更改。

    这对我来说很有意思,因为我可以发誓规则已经执行,而我是对的一半:

    加载会话时执行WHEN部分。为什么?我没有丝毫想法...... 我正在追逐一个红色听证会,因为我在我的部分中调用一个函数(正如你在规则中看到的那样)迭代并根据我收到的事件插入所有事实。

    我的解析功能显然有记录功能,所以每次重新加载会话时,都会在我的终端上发出一条日志,暗示我的规则正在执行。

    然后我将我的规则改为非常具体(就像我可能的输出一样)。我尽可能深地调试,但我仍然无法确定为什么在地球上重新创建会话正在执行规则的时间部分。我决定这个:魔术。还有更多细节:

    drools持久性https://docs.jboss.org/jbpm/v6.2/userguide/jBPMPersistence.html的文档说明这些人实施了他们自己的序列化/反序列化策略以加快这个过程。我决心将这种自定义策略归咎于我所看到的。

    获得的经验教训:  *不要在when部分创建对象(因为这会在加载会话时减慢你的速度,因为所有部件都被执行)  *追逐红色鲱鱼是我的屁股疼痛。

    总而言之:我相信(最多可以说99%)加载会话不会执行规则。

    但是,如果有人可以告诉我为什么何时执行部件而后部件没有执行,请执行此操作。

    感谢您的帮助