点击上方蓝
字关注~
在上一篇StreamOperator源码简析从源码角度分析了StreamOperator以及其实现类,此篇幅主要分析一下如何自定义一个StreamOperator。
StreamOperator接口提供了其生命周期的抽象方法,例如初始化方法setup、open、initializeState,checkpoint相关方法prepareSnapshotPreBarrier、snapshotState,但是我们没有必要去自己一一实现这些方法,可以继承其抽象类AbstractStreamOperator,覆盖一些我们需要重写的方法。在上一篇分析中提到对于source端不需要接受上游数据,也就不需要实现OneInputStreamOperator或者TwoInputStreamOperator接口,如果我们需要接收上游数据就必须实现这两个接口中的一个,主要看一个输入还是两个输入来选择。
案例:假设我们现在需要实现一个通用的定时、定量的输出的StreamOperator。
实现步骤:
继承AbstractStreamOperator抽象类,实现OneInputStreamOperator接口
重写open方法,调用flink 提供的定时接口,并且注册定时器
重写initializeState/snapshotState方法,由于批量写需要做缓存,那么需要保证数据的一致性,将缓存数据存在状态中
重写processElement方法,将数据存在缓存中,达到一定大小然后输出
由于需要做定时调用,那么需要有一个定时调用的回调方法,那么定义的类需要实现ProcessingTimeCallback接口,并且实现其onProcessingTime方法(关于flink定时可以参考定时系列文章)
代码:
publicabstractclassCommonSinkOperator<T extendsSe