Как указано в документе CEP (https://ci.apache.org/projects/flink/flink-docs-release-1.5/dev/libs/cep.html), что в последовательности шаблонов допускается только одно временное ограничение, я изо всех сил пытаюсь найти способ обработки бизнес-кейса, который содержит 2 временных ограничения.
Мне нужно отслеживать некоторые бизнес-события и предупреждать о событиях, соответствующих следующим правилам:
- новая учетная запись зарегистрирована
- аккаунт аутентифицируется через 5 минут после регистрации
- счет совершает не менее 2 транзакций, сумма транзакции которых превышает 1000,00 в течение следующего 1 часа.
А код выглядит примерно так:
Pattern<Event, ?> pattern = Pattern.<Event>begin("register").where(new SimpleCondition<Event>() {
@Override
public boolean filter<Event value> throws Exception {
return (value.getEventType() == EventType.REGISTER);
}
}).followedBy("authentication").where(new SimpleCondition<Event>() {
@Override
public boolean filter<Event value> throws Exception {
return (value.getEventType() == EventType.AUTHENTICATION);
}
}).where(new IterativeCondition<Event>() {
@Override
public boolean filter(Event value, Context<Event> ctx) throws Exception {
for (Event event : ctx.getEventsForPattern("register")) {
if (value.getEventTime() - event.getEventTime() <= 1000 * 60 * 5) {
return true;
}
}
return false;
}
}).followedBy("transaction").where(new SimpleCondition<Event>() {
@Override
public boolean filter<Event value> throws Exception {
return (value.getEventType() == EventType.TRANSACTION && value.getAmount() > 1000.00);
}
}).where(new IterativeCondition<Event>() {
@Override
public boolean filter(Event value, Context<Event> ctx) throws Exception {
for (Event event : ctx.getEventsForPattern("authentication")) {
if (value.getEventTime() - event.getEventTime() <= 1000 * 60 * 60) {
return true;
}
}
return false;
}
}).timesOrMore(2);
Вы можете видеть, что я использую 2 IterativeConditions для обработки временных ограничений. Есть ли лучший способ сделать код более лаконичным?