2015-12-18 33 views
0

我對此感到茫然,似乎無法在文檔中找到答案。我正在觀察以下行爲。我有這樣的規則:口水加載會話似乎火規則

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()加載會話以某種方式觸發了所有規則。

我不明白unmarshalling觸發器如何規則執行,但這顯然是錯誤的。我已經執行了該規則,不應執行兩次。

在一個測試案例中(我的測試不會創建永久會話,因爲我只想要測試規則),我可以調用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> 

謝謝!

回答

0

因爲fireUntilHalt一方面在實模式和STREAM會話中使用事件,另一方面使用fireAllRules保存和重新啓動會話是有些矛盾的範例。

如果您有事件,我建議您使用API​​在線程中設置和啓動(有狀態)會話,並在事件到達時插入事件(事件)。

+0

fireUntilHalt無法在持久會話上調用。我不一定需要使用事件。簡單地通過入口點插入似乎也會在加載時重新執行。 – pandaadb

+0

如果你省略'聲明乘客/ @角色(事件)',你試過會發生什麼? – laune

+0

嘿,是的,我刪除了所有事件聲明,並刪除了入口點。這是相同的行爲,會話被加載,然後再次執行規則的匹配。 – pandaadb

0

從調試和測試運行的東西的痛苦痛苦痛苦的日子更新/回答:

  1. 我懷疑我的休眠設置是錯誤的,那麼錯誤的事情得到了堅持。我最終拋棄了這種方法,並編寫了手動編組/解編組的東西。

創建/加載/重新創建/加載後,我可以確認會話永遠不會改變文件。

這是對我有意思,因爲我可以發誓,規則執行,我說對了一半:

的當加載會話時執行的一部分。爲什麼?我沒有絲毫的想法... 我正在追逐一個紅色的聽證會,因爲我在我的部分(如規則中所見)中調用函數來迭代並根據我收到的事件插入所有事實。

我的解析函數顯然有日誌記錄,所以每次我重新加載會話時,我都會通過終端暗示我的規則正在執行中。

然後,我改變了我的規則是非常非常具體(如在輸出無論我可能可以)。我儘可能深入地進行了調試,而且我仍然無法確定重新創建會話的原因是否正在執行規則的when部分。我解決了這個問題:魔術。並詳細一點:

drools持久性https://docs.jboss.org/jbpm/v6.2/userguide/jBPMPersistence.html的文件聲明,這些人實施了自己的serialze/deserialize策略,以加快進程。我決心把這個定製策略歸咎於我所看到的。

教訓: *請勿創建對象時,部分 (因爲因爲所有加載會話時部分執行時,這會減慢你的速度)*追逐紅鯡魚是我的屁股疼。

所以總結一下:我相信(最多說99%)加載會話不執行規則。

但是,如果任何人都可以告訴我什麼時候部分執行,然後部分不是,請這樣做。

感謝您的幫助