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在线程中设置和启动(有状态)会话,并在它们到达时插入事实(事件)。在调试、测试和运行内容的痛苦一天中的更新/回答:
感谢您的帮助Fireuntlhalt无法在持续会话中调用。我不一定需要使用事件。简单地通过入口点插入似乎在加载时也会重新执行。您是否尝试过如果忽略
声明乘客/@role(event)
,会发生什么情况?嘿,是的,我删除了所有事件声明,并删除了入口点。这是相同的行为,会话被加载,然后再次执行规则的匹配。考虑在DROLLS错误报告站点上增加JIRA。我可以这样做,是的。IRC和往常一样有点。。。我目前正试图看看如果我直接使用marhsaller会发生什么