Я настроил слюни для запуска в режиме STREAM. Выполнение правил происходит в своем собственном потоке через fireUntilHalt (). Я сделал что-то вроде этого:
protected KieSession getKieSession() {
if (this.kieSession == null) {
this.kieSession = kieBase.newKieSession(kieSessionConfig, null);
this.setSessionGlobals(this.kieSession);
new Thread(new Runnable() {
@Override
public void run() {
kieSession.fireUntilHalt();
}
}).start();
}
return this.kieSession;
}
Затем я вставляю сообщения, пришедшие из rabbitmq, просто вызывая getKieSession (). Insert (fact) (обернутый в функцию execRules (), см. Тест ниже).
Во время работы моего приложения я использую часы реального времени. Проблема заключается в тестировании, используя тот же способ для инициализации правил сеанса и запуска, но с псевдо-часами. У меня есть следующее правило:
rule "rule 5"
no-loop
when
$l: ImageDTOList()
$h: UpdateHeartBeat( list == $l )
not( UpdateHeartBeat( this != $h, list == $l, this after[0s, 60s] $h ) )
then
System.out.println("rule 5");
delete( $l );
DroolsUtils.injectImageDTOListEvent($l);
end
И следующий тест:
@Test
public void testListEmitted() throws ParseException, InterruptedException {
// Carga de datos del test
ImageDTO dto1 = converter
.fromInputStream(getClass().getClassLoader().getResourceAsStream("amqp/escenario1/image1.json"));
ImageDTO dto2 = converter
.fromInputStream(getClass().getClassLoader().getResourceAsStream("amqp/escenario1/image2.json"));
ImageDTO dto3 = converter
.fromInputStream(getClass().getClassLoader().getResourceAsStream("amqp/escenario1/image3.json"));
consumer.execRules(dto1);
clock.advanceTime(10, TimeUnit.SECONDS);
System.out.println(clock.getCurrentTime());
consumer.execRules(dto2);
clock.advanceTime(10, TimeUnit.SECONDS);
System.out.println(clock.getCurrentTime());
consumer.execRules(dto3);
clock.advanceTime(65, TimeUnit.SECONDS);
System.out.println(clock.getCurrentTime());
consumer.getKieSession().fireAllRules();
Thread.sleep(3000);
}
Результат теста:
10000
20000
85000
rule 1
rule 3
rule 3
Если я имитирую тест в реальном времени, с запущенным приложением, то же самое выполняется «правило 1», «правило 3», «правило 3», и «правило 5» через одну минуту после.
Таким образом, при использовании псевдо-часов (теста) пятое правило не срабатывает, единственное, которое использует «после» или любой другой временной оператор. Он не срабатывает даже при добавлении ручной функции fireAllRules () в конце теста перед вызовом в спящем режиме.
Каким образом можно поджечь псевдо-часы?