需求:Flink 检测10s 的温度连续上升,则输出报警
方案:我们使用了keyBy函数,因为只有KeyedProcessFunction只能操作KeyedStream
下面简单介绍一下KeyedStream
KeyedProcessFunction类型的上层父类是RichFunction, 对分流后每一个元素调用一次KeyedProcessFunction中的elementProcess方法,可以通过Context调用timeServier, 注册定时器, 获得当前水位线, 处理时间, 等信息。
思路:
1、定义状态,保存上一次的温度值,报警定时器时间戳
2、processElement 内每次处理数据,取出上一次的温度值和状态。如果温度上升并且没有注册定时器,则注册一个10秒后的定时器,开始等待onTimer的触发。
3、如果温度下降,那么删除定时器。
import com.atguigu.apitest.beans.SensorReading;
import org.apache.flink.api.common.state.ValueState;
import org.apache.flink.api.common.state.ValueStateDescriptor;
import org.apache.flink.api.java.tuple.Tuple;
import org.apache.flink.configuration.Configuration;
import org.apache.flink.streaming.api.datastream.DataStream;
import org.apache.flink.streaming.api.environment.StreamExecutionEnvironm