Я использую Drools 6.2.0.Final, и мне нужно обработать набор событий, используя окно: время. Каждое событие имеет поле даты.
public class Event {
private Long id;
private Date date;
...
И в моем дрл:
declare org.drools.examples.broker.events.Event
@role( event )
@timestamp (date)
end
rule "test"
when
$count: Number() from accumulate (
$e: Event() over window:time(40s) from entry-point "stream" ,
count($e))
then
System.out.println("Count:" + $count);
end
- e1 (2015-01-01 00:00:00)
- e2 (2015-01-01 00:00:20)
- e3 (2015-01-01 00:00:40)
- e4 (2015-01-01 00:01:00)
Сценарий 1: одновременное использование режима реального времени и вставка набора событий.
session.getEntryPoint("stream").insert(e1);
session.fireAllRules();
session.getEntryPoint("stream").insert(e2);
session.fireAllRules();
session.getEntryPoint("stream").insert(e3);
session.fireAllRules();
session.getEntryPoint("stream").insert(e4);
session.fireAllRules();
Сценарий 2: использование псевдо, одновременно вставляет набор и событие и добавляет к часам смещение события.
session.getEntryPoint("stream").insert(e1);
session.fireAllRules();
clock.advanceTime(20, TimeUnit.SECONDS);
session.getEntryPoint("stream").insert(e2);
session.fireAllRules();
clock.advanceTime(40, TimeUnit.SECONDS);
session.getEntryPoint("stream").insert(e3);
session.fireAllRules();
clock.advanceTime(60, TimeUnit.SECONDS);
session.getEntryPoint("stream").insert(e4);
session.fireAllRules();
Второй сценарий работает нормально. Но у меня есть несколько вопросов:
- Какова связь между @timestamp и «над окном: время»?
- Что произойдет, если нужно вставить несортированные события (по отметке времени) в рабочую память?
- Могу ли я использовать временную метку, обозначаемую моим событием, вместо временной метки, обозначаемой временем вставки?
Спасибо.
ОБНОВЛЕНИЕ 1
@timestamp, @duration и т. д. используются только для того, чтобы связать события вместе (например, A перед B, A встречается с B и т. д.), и они не связывают событие с часами. Но «над окном: время» основано на часах Друлса. Время окна использует момент, когда событие было вставлено в рабочую память, чтобы соответствовать правилу. Вам нужно использовать потоковый режим Drools.