可以通过addSource方法来自定义SourceFunction,并可指定Timestamp和Watermark生成规则。addSource方法接收一个SourceFunction<OUT>参数,OUT表示返回的元素类型,并返回一个DataStreamSource<OUT>类型的对象。
SourceFunction中定义了一个run(SourceContext<T> ctx)方法来启动数据源,而SourceContext对象中定义了:
- 数据源发送事件数据并生成Timestamp方法:collectWithTimestamp(T element,long timestamp)
element代表需发送的元素,timestamp代表这个元素对应的时间戳。该方法只在EventTime时有效,ProcessingTime时设置的timestamp直接忽略。 - 生成Watermark的方法:emitWatermark(Watermark mark)
当发送一个时间戳为T的mark时,表示该数据流上不会再有timestamp<=T的事件记录,一般来说,这个T是基于最大的timestamp来生成的,比如最大timestamp-1。
import org.apache.flink.api.java.tuple.Tuple3;
import org.apache.flink.streaming.api.TimeCharacteristic;
import org.apache.flink.streaming.api.datastream.DataStream;
import org.apache.flink.streaming.api.environment.StreamExecutionEnvironment;
import org.apache.flink.streaming.api.functions.source.SourceFunction;
import org.apache.flink.streaming