2015-12-01 7 views
0

Мне пришлось создать пары правил, чтобы убрать мои события. Кажется, они не истекают. Мне нужны были одноразовые события. Вы можете видеть ниже, они используют длительность по умолчанию, ноль.Жизненный цикл событий Drools

Так, например, если я исключаю правила отвода, а затем сначала вставляю RemoveConnectionEvent, а затем вставляю CreateConnectionEvent, правило RemoveConnection все равно срабатывает. (Использование слушателя повестки дня в моих модульных тестах)

Мое ожидание события состояло в том, что RemoveConnectionEvent будет проигнорирован, он ничего не сделает, если его условия не будут выполнены немедленно. Я не ожидал, что он повесится и вызовет правило RemoveConnection, когда условия правил будут выполнены, когда правило NewConnection ответит на CreateConnectionEvent.

Чтобы мои правила действовали так, как я ожидал, я создал RetractedCreation, RetractedRemoval и RetractedUpdate. Кажется, это взлом. Я воображаю, что мои события ошибочны.

Любые идеи?

ps Это было довольно хорошо Q & A, но я не использую окна. Это может означать, что, возможно, мой взлом - это «явная политика истечения срока действия».

Test Event expiration in Drools Fusion CEPTest Event Expiration

Вот мое правило.

package com.xxx 
import com.xxx.ConnectedDevice 
import com.xxx.RemoveConnectionEvent 
import com.xxx.CreateConnectionEvent 
import com.xxx.UpdateConnectionEvent 

declare CreateConnectionEvent @role(event) end 
declare UpdateConnectionEvent @role(event) end 
declare RemoveConnectionEvent @role(event) end 

rule NewConnection 
    when 
     $connection : CreateConnectionEvent($newChannel : streamId) 
     not ConnectedDevice(streamId == $newChannel) 
    then 
     insert(new ConnectedDevice($newChannel)); 
end 

rule RetractedCreation 
    when 
     $creationEvent : CreateConnectionEvent($newChannel : streamId) 
     exists ConnectedDevice(streamId == $newChannel) 
    then 
     retract($creationEvent) 
end 

rule RemoveConnection 
    when 
     $remove : RemoveConnectionEvent($newChannel : streamId) 
     $connection : ConnectedDevice(streamId == $newChannel) 
    then 
     retract($connection); 
end 

rule RetractedRemoval 
    when 
     $removalEvent : RemoveConnectionEvent($newChannel : streamId) 
     not ConnectedDevice(streamId == $newChannel) 
    then 
     retract($removalEvent) 
end 

rule UpdateConnection 
    when 
     $connectionUpdate : UpdateConnectionEvent($newChannel : streamId) 
     $connection : ConnectedDevice(streamId == $newChannel) 
    then 
    $connection.setLastMessage(); 
end 

rule RetractedUpdate 
    when 
     $removalEvent : UpdateConnectionEvent($newChannel : streamId) 
     not ConnectedDevice(streamId == $newChannel) 
    then 
     retract($removalEvent) 
end 
+0

Привет Я являюсь оператором Q & A скользящего окна, которое вы связали. Я думаю, что ответ @laune ниже, как всегда, очень велик, просто FYI, поскольку вы не упоминаете, как управляется сеансовым часом в вашем коде, этот другой проигрыватель, который не имеет отношения к скользящему окну, а к синхронизации синхронизации часов и автоматического события срок действия https://issues.jboss.org/browse/DROOLS-158 может иметь аналогию с вашим вариантом использования. Надеюсь, что это тоже поможет, Ciao – tarilabs

ответ

1

Это автоматическое истечение срока действия является довольно неуловимым. Нет четкого определения, когда он будет работать, и что нужно сделать, чтобы заставить его работать.

В вашем, по-видимому, простом случае, когда вы не используете временные операторы и ожидаете, что события должны быть убраны после того, как они соответствуют одному правилу, я бы принял следующую стратегию, не теряя при этом другую мысль о «предполагаемом истечении срока действия» и «управляемый» жизненный цикл".

Возможно, у вас есть общий (абстрактный) базовый класс для ваших событий; иначе создайте интерфейс маркера и присоедините его ко всем событиям. Назовем этот тип Event. Тогда одно правило

rule "retract event" 
salience -999999 
when 
    $e: Event() 
then 
    retract($e); 
end 

будет заботиться обо всех событиях (Создать, обновить, удалить).

Редактировать Вы также можете использовать явные настройки для истечения срока действия.

declare CreateConnectionEvent 
    @role(event) 
    @expires(0ms) 
end 

Обязательно используйте

KieBaseConfiguration config = ks.newKieBaseConfiguration(); 
config.setOption(EventProcessingOption.STREAM); 
KieBase kieBase = kieContainer.newKieBase(config); 

при создании KieBase. Я также рекомендую «разрешить переход времени», то есть продвигать псевдо-часы или пропускать поток с fireUntilHalt для jiffy или two после фактической вставки.

+0

В качестве альтернативы добавлено четкое определение срока действия. – laune

Смежные вопросы