Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/jpa/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Session Drools加载会话似乎触发了规则_Session_Jpa_Drools_Rule Engine_Kie - Fatal编程技术网

Session Drools加载会话似乎触发了规则

Session Drools加载会话似乎触发了规则,session,jpa,drools,rule-engine,kie,Session,Jpa,Drools,Rule Engine,Kie,我对此不知所措,似乎在文档中找不到答案。我观察到以下行为。我有一条规则: 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 "CSVReadyEnt

我对此不知所措,似乎在文档中找不到答案。我观察到以下行为。我有一条规则:

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
,它将正确执行。最后它到达了安全点,一切都很酷

然后,我重新启动我的应用程序并按如下方式加载会话:

KieSession loadedKieSession = kieServices.getKieService().getStoreServices().loadKieSession(session.getId(), kieBase, ksConf, kieServices.getEnvironment());
我从kmodule.xml获取的基和配置

现在发生的情况是,如果不调用
fireAllRules()
加载会话,会以某种方式触发触发所有规则

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

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

这里面有人吗?我非常乐意分享任何代码

以下是我的persistence.xml:

<persistence-unit name="org.jbpm.persistence.jpa" transaction-type="JTA">

        <provider>org.hibernate.ejb.HibernatePersistence</provider>

        <class>org.drools.persistence.info.SessionInfo</class>
        <class>org.drools.persistence.info.WorkItemInfo</class>

        <exclude-unlisted-classes>true</exclude-unlisted-classes>
        <properties>
            <property name="hibernate.dialect" value="org.hibernate.dialect.MySQLDialect" />
            <property name="hibernate.max_fetch_depth" value="30" />
            <property name="hibernate.hbm2ddl.auto" value="update" />
            <property name="hibernate.show_sql" value="true" />
            <property name="hibernate.transaction.jta.platform" value="org.hibernate.service.jta.platform.internal.JBossStandAloneJtaPlatform" />
        </properties>
    </persistence-unit>

org.hibernate.ejb.HibernatePersistence
org.drools.persistence.info.SessionInfo
org.drools.persistence.info.WorkItemInfo
真的

谢谢

一方面,在实模式和由于fireUntilHalt而运行的流会话中使用事件,另一方面,使用fireAllRules保存和重新启动会话,这两种模式有些矛盾


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

在调试、测试和运行内容的痛苦一天中的更新/回答:

  • 我怀疑我的hibernate设置是错误的,所以错误的东西一直存在。我最终放弃了这种方法,编写了一个手动编组/解编组的东西
  • 创建/加载/重新创建/加载后,我可以确认会话不会在文件中更改

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

    加载会话时执行WHEN部分。为什么?我一点也不知道。。。 我在追踪一个红色的听证会,因为我在when部分调用了一个函数(正如你在规则中看到的),以迭代和插入基于我接收到的事件的所有事实

    我的解析函数显然有日志记录功能,所以每次我重新加载会话时,终端上都会出现大量日志,提示我的规则正在执行

    然后,我将规则更改为非常具体的规则(尽可能在输出中)。我尽可能深入地进行了调试,但我似乎仍然无法确定到底为什么重新创建会话是在执行规则的when部分。我决定了:魔法。再加上一点细节:

    drools持久性的文档说明,这些家伙实现了他们自己的序列化/反序列化策略,以加快进程。我决定将这种定制策略归咎于我所看到的

    经验教训: *不要在when部分中创建对象(因为这将在加载会话时减慢速度,因为所有when部分都已执行) *追逐红鲱鱼是我讨厌的事

    总而言之:我相信(高达99%)加载会话并不是在执行规则

    但是,如果有人能告诉我为什么“当”部分执行而“然后”部分不执行,请告诉我


    感谢您的帮助

    Fireuntlhalt无法在持续会话中调用。我不一定需要使用事件。简单地通过入口点插入似乎在加载时也会重新执行。您是否尝试过如果忽略
    声明乘客/@role(event)
    ,会发生什么情况?嘿,是的,我删除了所有事件声明,并删除了入口点。这是相同的行为,会话被加载,然后再次执行规则的匹配。考虑在DROLLS错误报告站点上增加JIRA。我可以这样做,是的。IRC和往常一样有点。。。我目前正试图看看如果我直接使用marhsaller会发生什么