我有兩條規則。這是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的時間事件已經發生了很大的變化?我已經放入調試線來確認事件在時間推移之前和之後仍然存在,但定時事件不會觸發。
謝謝。只需在clock.advanceTime後添加另一個ksession.fireAllRules()即可觸發我的重試規則。 – 2015-02-24 15:43:52