2015-02-23 28 views
0

我有兩條規則。這是Drools的6.1.0.Final我的計時規則不會開火Drools 6.1.0.Final

rule "HandleSomeEvent" 
salience 5 
no-loop 
when 
    $eventA : SomeEvent() 
then 
    MyClass.handleSomeEvent($eventA); 
end 


rule "HandleSomeEventRetry" 
    timer(int: 15m 15m) 
    no-loop 
    when 
     $eventA : SomeEvent() 
    then 
     MyClass.handleSomeEvent($eventA); 
end 

這些規則測試在Drools中5.1.1沒有問題的工作,但我試圖重構爲6.1.0.Final。在我的測試類我成立了一個KieSession

KieServices ks = KieServices.Factory.get(); 
    KieContainer kContainer = ks.getKieClasspathContainer(); 

    KieBaseConfiguration kBaseConfig = ks.newKieBaseConfiguration(); 
    kBaseConfig.setOption(EqualityBehaviorOption.EQUALITY); 
    KieBase kBase = kContainer.newKieBase(kBaseConfig); 

    KieSessionConfiguration kSessionConfig = ks.newKieSessionConfiguration(); 
    kSessionConfig.setOption(ClockTypeOption.get("pseudo")); 

    ksession = kBase.newKieSession(kSessionConfig, null); 

    SessionPseudoClock clock = ksession.getSessionClock(); 
    ksession.setGlobal("MyClass", MyClass); 

我在這個單元測試測試以確認所有的規則火的時候他們的活動才能通過,他們都通但超時重試的事件。我試圖測試處理事件和重試如下

SomeEvent e... 
    AgendaEventListener ael = mock(AgendaEventListener.class); 
    ksession.addEventListener(ael); 
    ksession.insert(e); 
    ksession.fireAllRules(); 

    clock.advanceTime(15, TimeUnit.MINUTES); 

    ArgumentCaptor<AfterMatchFiredEvent> amfe = ArgumentCaptor.forClass(AfterMatchFiredEvent.class); 
    verify(ael, times(2)).afterMatchFired(amfe.capture()); 

當測試這個5.1.1我還可以抓住從ArgumentCaptor事件和驗證引發該個體規則的名稱。第一次是第一次,第二次是定時重試。然而在6.1.0.Final中,只有一個Match甚至被解僱。我找不到任何文檔來支持這一點,但是6.1的時間事件已經發生了很大的變化?我已經放入調試線來確認事件在時間推移之前和之後仍然存在,但定時事件不會觸發。

回答

0

確實發生了一些變化,因爲(IIRC)Drools團隊似乎不喜歡由此產生的效果和/或運行的定時器的不完全定義的語義,而規則引擎而不是活動。 (請注意,您可以在會話中重複呼叫session.fire*()。)

在轉到6.x時,決定暫停在引擎未運行時激活定時器控制的規則。

你可以(使用您的規則,但有一個事實,一個字符串):

 kieSession.insert("Some fact"); 
     kieSession.fireAllRules(); 
     System.out.println("sleep"); 
     Thread.sleep(8000); 
     System.out.println("wake-up"); 
     kieSession.fireUntilHalt(); 

你會觀察到的「重試」落入睡眠間隔發射被延遲,直到之後喚醒(並且未能遵守定時器中定義的時間)。

但是,如果您立即致電fireUntilHalt,一切正常。您可能需要添加其他機制才能正常關機。

+0

謝謝。只需在clock.advanceTime後添加另一個ksession.fireAllRules()即可觸發我的重試規則。 – 2015-02-24 15:43:52