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