2012-12-14 67 views
1

下面是規則:滴料::規則得到執行,即使條件specifed不滿意


rule "RelStatusUpdateCalcCheck" 
salience 55 
no-loop true 
when  
$evt : UpdateRateStatusReq(statusID == RateStatusEnum.READY.getValue() || == RateStatusEnum.HOLIDAY_ROLL_FORWARD.getValue() || == RateStatusEnum.ROLL_FORWARD.getValue()) from entry-point RequestStream 
$rr : ReliableRate(rateId == $evt.getRateID()) 
$dr : DerivedRate(holidayFlag == false, grfLock == false, $lr : listInputRateId, $lr.contains($evt.getRateID()))  
then 
cepService.relStatusUpdateCalcCheck($evt, $rr, $dr); 

end** 

最後一個條件是:如果「holidayflag」是假的,其他條件也滿意,然後只執行java方法。但即使假日標誌爲true,該方法也會執行。只有當我重新啓動我的應用服務器時,該方法不會在holidayflag爲true時執行。這是爲什麼?

+0

如果它重新啓動服務器後表現正常,有什麼問題?不知道你的應用程序,我猜想,這已寫入只在啓動時加載的知識基礎了。如果這是問題,可以在運行時重新加載知識庫。 – Steve

回答

1
Thanks for the reply. I got the root cause of this issue. Actually when I update the holidayFlag to 'true',the DerivedRate object is updated but the Drools session is never updated as the result of which when the rules gets executed it still refers to the old value. When I restart my app I load the Facts again that's why this issue gets resolved after restart. 

Below is the code that i added in order to resolve this issue:: 
DerivedRate dr = (DerivedRate) qd.iterator().next().get("dr"); 
FactHandle fh = session.getFactHandle(dr); --> new code 
dr.setHolidayFlag(true); 
session.update(fh, dr);  --> new code 
2

一種可能的解釋是

你在你的工作記憶多DerivedRate事實,這些事實符合對你的,因爲無論是規則:

  • 您插入這些事實,因爲一個編程錯誤的(如,從多個線程訪問知識庫的靜態實例)
  • 您使用有狀態的知識會話和DerivedRate事實是來自以前操作的剩餘部分。
相關問題