1

以下がルールです。


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' が false で、他の条件も満たされている場合、Java メソッドのみを実行することを示しています。ただし、休日フラグが true の場合でもメソッドが実行されます。アプリケーションサーバーを再起動したときにのみ、ホリデーフラグがtrueのときにメソッドが実行されません。これはなぜですか?

4

2 に答える 2

2

考えられる説明は

作業メモリーに複数のDerivedRateファクトがあり、これらのファクトは次のいずれかの理由でルールと一致します。

  • プログラミングエラー(複数のスレッドからナレッジベースの静的インスタンスにアクセスするなど)が原因で、これらのファクトを挿入します
  • ステートフルナレッジセッションを使用すると、DerivedRateファクトは以前の操作の残り物になります。
于 2012-12-14T17:56:45.660 に答える
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
于 2012-12-17T04:02:57.767 に答える