|
@@ -2,6 +2,10 @@ package flink.zanxiangnet.ad.monitoring.stream;
|
|
|
|
|
|
import com.google.common.collect.Lists;
|
|
|
import flink.zanxiangnet.ad.monitoring.trigger.TimerCountTrigger;
|
|
|
+import org.apache.flink.api.common.eventtime.SerializableTimestampAssigner;
|
|
|
+import org.apache.flink.api.common.eventtime.WatermarkStrategy;
|
|
|
+import org.apache.flink.api.java.functions.KeySelector;
|
|
|
+import org.apache.flink.streaming.api.datastream.DataStream;
|
|
|
import org.apache.flink.streaming.api.datastream.KeyedStream;
|
|
|
import org.apache.flink.streaming.api.datastream.SingleOutputStreamOperator;
|
|
|
import org.apache.flink.streaming.api.functions.windowing.WindowFunction;
|
|
@@ -14,20 +18,25 @@ import java.util.List;
|
|
|
|
|
|
public class KeyedBatchStream<T, KEY> {
|
|
|
|
|
|
- private final KeyedStream<T, KEY> stream;
|
|
|
+ private final DataStream<T> stream;
|
|
|
+ private final KeySelector<T, KEY> keySelector;
|
|
|
// 缓存刷新的间隔时间
|
|
|
private final Time bufferRefreshTime;
|
|
|
// 缓存的最大数据量
|
|
|
private final Long maxBufferCount;
|
|
|
|
|
|
- public KeyedBatchStream(KeyedStream<T, KEY> stream, Long maxBufferCount, Time bufferRefreshTime) {
|
|
|
+ public KeyedBatchStream(DataStream<T> stream, KeySelector<T, KEY> keySelector, Long maxBufferCount, Time bufferRefreshTime) {
|
|
|
this.stream = stream;
|
|
|
+ this.keySelector = keySelector;
|
|
|
this.bufferRefreshTime = bufferRefreshTime;
|
|
|
this.maxBufferCount = maxBufferCount;
|
|
|
}
|
|
|
|
|
|
public SingleOutputStreamOperator<List<T>> toBatch() {
|
|
|
- return stream.window(TumblingEventTimeWindows.of(bufferRefreshTime))
|
|
|
+ return stream.assignTimestampsAndWatermarks(WatermarkStrategy.<T>forMonotonousTimestamps()
|
|
|
+ .withTimestampAssigner((SerializableTimestampAssigner<T>) (element, recordTimestamp) -> System.currentTimeMillis()))
|
|
|
+ .keyBy(keySelector)
|
|
|
+ .window(TumblingEventTimeWindows.of(bufferRefreshTime))
|
|
|
.trigger(new TimerCountTrigger<>(maxBufferCount))
|
|
|
// 这里不能使用 lambda表达式,flink无法推测类型
|
|
|
.apply(new WindowFunction<T, List<T>, KEY, TimeWindow>() {
|