我有以下案例场景
有两台虚拟机正在向Kafka发送流,这些虚拟机正在被CEP引擎接收,当单个流满足特定条件时会生成警告。
目前,CEP正在检查两个患者的两个流的相同条件(当心率> 65和呼吸率> 68时),并且如下所示并行发出警报
// detecting pattern
Pattern<joinEvent, ? > pattern = Pattern.<joinEvent>begin("start")
.subtype(joinEvent.class).where(new FilterFunction<joinEvent>() {
@Override
public boolean filter(joinEvent joinEvent) throws Exception {
return joinEvent.getHeartRate() > 65 ;
}
})
.subtype(joinEvent.class)
.where(new FilterFunction<joinEvent>() {
@Override
public boolean filter(joinEvent joinEvent) throws Exception {
return joinEvent.getRespirationRate() > 68;
}
}).within(Time.milliseconds(100));
但我想为两个Streams使用不同的条件。例如,如果
,我想提出警报For patient A : if heart rate > 65 and Respiration Rate > 68
For patient B : if heart rate > 75 and Respiration Rate > 78
我如何实现这一目标?我是否需要在同一环境中创建多个流环境或多个模式。
答案 0 :(得分:2)
根据您的要求,您可以创建2种不同的模式,以便在需要时进行明确分离。
如果你想用相同的模式执行它,那么它也是可能的。为此,请在一个kafka源中阅读所有kafka主题:
FlinkKafkaConsumer010<JoinEvent> kafkaSource = new FlinkKafkaConsumer010<>(
Arrays.asList("topic1", "topic2"),
new StringSerializerToEvent(),
props);
这里我假设两个主题的事件结构是相同的,你有患者姓名以及被传送的事件的一部分。
一旦你这样做,它变得很容易,因为你只需要创建一个带有“Or”的模式,如下所示:
Pattern.<JoinEvent>begin("first")
.where(new SimpleCondition<JoinEvent>() {
@Override
public boolean filter(JoinEvent event) throws Exception {
return event.getPatientName().equals("A") && event.getHeartRate() > 65 && joinEvent.getRespirationRate() > 68;
}
})
.or(new SimpleCondition<JoinEvent>() {
@Override
public boolean filter(JoinEvent event) throws Exception {
return event.getPatientName().equals("B") && event.getHeartRate() > 75 && joinEvent.getRespirationRate() > 78;
}
});
只要条件匹配,就会产生匹配。虽然,我不太确定你的例子中有什么“.within(Time.milliseconds(100))”。