Drools 6.5: правило, основанное на временном операторе, не срабатывает с псевдо-часами - PullRequest
0 голосов
/ 08 января 2019

Я настроил слюни для запуска в режиме 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 () в конце теста перед вызовом в спящем режиме.

Каким образом можно поджечь псевдо-часы?

...