使用flink自带的策略 BoundedOutOfOrderness时,发现在使用事件时间窗口时,在下一个窗口的数据到来之前没有输出的情况。
通过查找信息发现,这种策略的水印发送需要依靠传入每个数据的事件时间,所以当没有下一个窗口的数据到来时,并不能发送水印让flink知道已经超时了。为了解决这个问题,查找官方文档发现,发现可以自定义一个forBoundedOutOfOrderness策略来解决。代码如下:
public class TimeLagWatermarkGenerator implements WatermarkGenerator<testOB> {
private final long maxTimeLag = 5000; // 5 seconds
@Override
public void onEvent(testOB event, long eventTimestamp, WatermarkOutput output) {
// don't need to do anything because we work on processing time
}
@Override
public void onPeriodicEmit(WatermarkOutput output) {
output.emitWatermark(new Watermark(System.currentTimeMillis() - maxTimeLag));
}
}
.assignTimestampsAndWatermarks(new WatermarkStrategy<testOB>() {
@Override
public WatermarkGenerator<testOB> createWatermarkGenerator(WatermarkGeneratorSupplier.Context context) {
return new TimeLagWatermarkGenerator();
}
}
// .<testOB>forBoundedOutOfOrderness(Duration.ofSeconds(2))
.withTimestampAssigner((event, timestamp) -> {
// DateTimeFormatter pattern = DateTimeFormatter.ofPattern("yyyy-MM-dd'T'HH:mm:ss.SSS'Z'");
return event.getTimestamp();
}))