Apache flink 每当我在flink中使用TumblingEventWindow30秒并使用自定义触发器时,但该触发器未在注册的事件时间触发
我正在使用flink进行tumblingEventOperation,并创建一个自定义触发器对其执行操作。 我的翻滚窗口代码-Apache flink 每当我在flink中使用TumblingEventWindow30秒并使用自定义触发器时,但该触发器未在注册的事件时间触发,apache-flink,flink-streaming,eventtrigger,flink-cep,Apache Flink,Flink Streaming,Eventtrigger,Flink Cep,我正在使用flink进行tumblingEventOperation,并创建一个自定义触发器对其执行操作。 我的翻滚窗口代码- DataStream<JsonNode> processedWindowedStreamData = filteredData.assignTimestampsAndWatermarks(new ExtractTimeStamps()) .keyBy(jsonNode -> jsonNode.get("imei&quo
DataStream<JsonNode> processedWindowedStreamData = filteredData.assignTimestampsAndWatermarks(new ExtractTimeStamps())
.keyBy(jsonNode -> jsonNode.get("imei").asText()).window(TumblingEventTimeWindows.of(Time.seconds(30)))
.trigger(new ProcessingTimeCustomTrigger())
.process(new CollectTripStart());
DataStream processedWindowedStreamData=filteredData.AssignTimestamps和水印(新的ExtractTimeStamps())
.keyBy(jsonNode->jsonNode.get(“imei”).astex()).window(TumblingEventTimeWindows.of(Time.seconds(30)))
.trigger(新ProcessingTimeCustomTrigger())
.进程(新的CollectTripStart());
但是当我使用customTrigger在自定义时间触发它时,即在第一个元素(事件时间)后30秒,但它是根据timewindow.getEnd()触发的
公共类ProcessingTimeCustomTrigger扩展触发器{
@凌驾
public TriggerResult OneElement(JsonNode JsonNode,long l,TimeWindow TimeWindow,TriggerContext TriggerContext)引发异常{
ValueState firstSeen=triggerContext.getPartitionedState(
新的ValueStateDescriptor(“firstSeen”,Types.BOOLEAN));
//仅为第一个元素注册初始计时器
System.out.println(“开始时间是”+timeWindow.getStart());
System.out.println(“结束时间是”+timeWindow.getEnd());
if(firstSeen.value()==null){
//在第一个事件发生后60000毫秒启动窗口
long currentProcessingTime=triggerContext.getCurrentProcessingTime();
//triggerContext.RegisterProcessingTimer(currentProcessingTime+60000L);
长时间=l+30000L;
System.out.println(“事件时间为”+时间);
triggerContext.RegisterEventTimer(时间);
firstSeen.update(真);
}
//继续。现在不计算窗口
返回TriggerResult.CONTINUE;
}
@凌驾
public TriggerResult on ProcessingTime(长l、时间窗口时间窗口、TriggerContext TriggerContext)引发异常{
返回TriggerResult.CONTINUE;
}
@凌驾
public TriggerResult onEventTime(长ts、时间窗口、时间窗口、TriggerContext TriggerContext)引发异常{
System.out.println(“事件时间为”+ts);
返回TriggerResult.FIRE\u和\u PURGE;
}
@凌驾
公共无效清除(TimeWindow TimeWindow、TriggerContext TriggerContext)引发异常{
系统输出打印(“销毁”);
ValueState firstSeen=triggerContext.getPartitionedState(
新的ValueStateDescriptor(“firstSeen”,Types.BOOLEAN));
第一次看到。清除();
}
}
您能告诉我您使用的是真实数据还是虚拟数据吗?如果是这样的话,你能提供数据吗?现实生活中的数据…但我可以分享,记录时间是长格式的1606731168000所以,基本上你会收到上面带有时间戳的记录,你会期望它在1606731198000
时触发,但它会在1606731180000
附近触发??您还可以共享时间戳提取的代码吗?
public class ProcessingTimeCustomTrigger extends Trigger<JsonNode, TimeWindow> {
@Override
public TriggerResult onElement(JsonNode jsonNode, long l, TimeWindow timeWindow, TriggerContext triggerContext) throws Exception {
ValueState<Boolean> firstSeen = triggerContext.getPartitionedState(
new ValueStateDescriptor<>("firstSeen", Types.BOOLEAN));
// register initial timer only for first element
System.out.println("The start time is"+timeWindow.getStart());
System.out.println("The end time is"+timeWindow.getEnd());
if (firstSeen.value() == null) {
// FIRE the window 60000 msec after the first event
long currentProcessingTime = triggerContext.getCurrentProcessingTime();
// triggerContext.registerProcessingTimeTimer(currentProcessingTime + 60000L);
long time = l + 30000L;
System.out.println("The event time is"+time);
triggerContext.registerEventTimeTimer(time);
firstSeen.update(true);
}
// Continue. Do not evaluate window now
return TriggerResult.CONTINUE;
}
@Override
public TriggerResult onProcessingTime(long l, TimeWindow timeWindow, TriggerContext triggerContext) throws Exception {
return TriggerResult.CONTINUE;
}
@Override
public TriggerResult onEventTime(long ts, TimeWindow timeWindow, TriggerContext triggerContext) throws Exception {
System.out.println("Event time is"+ts);
return TriggerResult.FIRE_AND_PURGE;
}
@Override
public void clear(TimeWindow timeWindow, TriggerContext triggerContext) throws Exception {
System.out.println("Destroying");
ValueState<Boolean> firstSeen = triggerContext.getPartitionedState(
new ValueStateDescriptor<>("firstSeen", Types.BOOLEAN));
firstSeen.clear();
}
}