这里以KeyedProcessFunction作为示例。
模拟场景:有多个温度计去采集温度,数据格式:温度计id,采集时间,温度值
实现一个报警策略:在5s内采集到的温度连续上升,就报警。
要实现这个策略,有两个条件:
- 条件一:5秒内。可以调用时间服务(timerService)来创建一个定时器,5秒后触发,判断这段时间内的数据是否是连续上升的
- 条件二:温度连续上升。肯定要跟前一条数据比,可以用状态来记录前一条数据
主类代码如下:
import org.apache.flink.api.common.state.ValueStateDescriptor
import org.apache.flink.streaming.api.TimeCharacteristic
import org.apache.flink.streaming.api.functions.KeyedProcessFunction
import org.apache.flink.streaming.api.functions.timestamps.BoundedOutOfOrdernessTimestampExtractor
import org.apache.flink.streaming.api.scala._
import org.apache.flink.streaming.api.windowing.time.Time
import org.apache.flink.util.Collector
/**
* 测试ProcessFunction
* 模拟场景:温度计在5秒内温度连续上升,就报警
*/
object ProcessFunctionTest {
def main(args: Array[String]): Unit = {
val env = StreamExecutionEnvironment.getExecutionEnvironment
//设置时间特性:采用EventTime
env.setStreamTimeCharacteristic(TimeCharacteristic.EventTime)
val s