博客园 首页 私信博主 显示目录 隐藏目录 管理 动画

练习 : Flink 自定义Process_State 使用 OnTimer 连续3s大于70度 传感器报警

 1 package ontime;
 2 
 3 import com.Sensor;
 4 import org.apache.flink.api.common.state.ValueState;
 5 import org.apache.flink.api.common.state.ValueStateDescriptor;
 6 import org.apache.flink.api.java.tuple.Tuple;
 7 import org.apache.flink.configuration.Configuration;
 8 import org.apache.flink.streaming.api.functions.KeyedProcessFunction;
 9 import org.apache.flink.util.Collector;
10 
11 public class MyProcess extends KeyedProcessFunction<Tuple, Sensor,String> {
12 
13     ValueState<Double> tempState;
14     ValueState<Long> timeState;
15     private Integer tempInterval;
16     public MyProcess(Integer tempInterval){
17         this.tempInterval=tempInterval;
18     }
19 
20     @Override
21     public void open(Configuration parameters) throws Exception {
22         tempState=getRuntimeContext().getState(new ValueStateDescriptor<Double>("last-temp",Double.class));
23         timeState=getRuntimeContext().getState(new ValueStateDescriptor<Long>("last-time",Long.class));
24 
25     }
26 
27     @Override
28     public void processElement(Sensor sensor, Context context, Collector<String> collector) throws Exception {
29         Double lastTemp = tempState.value();
30         Long lastTime = timeState.value();
31         if (sensor.getSensorTemp()>70 && lastTime==null){
32             long times = context.timerService().currentProcessingTime() + tempInterval * 1000L;
33             context.timerService().registerProcessingTimeTimer(times);
34             timeState.update(times);
35         }else if (sensor.getSensorTemp()<70 && lastTime!=null ) {
36             context.timerService().deleteProcessingTimeTimer(lastTime);
37             timeState.clear();
38         }
39         tempState.update(sensor.getSensorTemp());
40 
41     }
42 
43     @Override
44     public void onTimer(long timestamp, OnTimerContext ctx, Collector<String> out) throws Exception {
45         System.out.println("sensor:"+ctx.getCurrentKey().getField(0)+"温度连续3秒大于70度");
46     }
47 
48     @Override
49     public void close() throws Exception {
50         timeState.clear();
51     }
52 }
 1 package ontime;
 2 
 3 import com.MySource;
 4 import com.Sensor;
 5 import org.apache.flink.streaming.api.datastream.DataStreamSource;
 6 import org.apache.flink.streaming.api.datastream.SingleOutputStreamOperator;
 7 import org.apache.flink.streaming.api.environment.StreamExecutionEnvironment;
 8 
 9 //StateTest
10 public class StateTest {
11     public static void main(String[] args) throws Exception {
12         StreamExecutionEnvironment env = StreamExecutionEnvironment.getExecutionEnvironment();
13         //并行度
14         env.setParallelism(1);
15         //自定义数据源 生成70度左右的传感器数据
16         DataStreamSource<Sensor> source = env.addSource(new MySource(70));
17         //打印
18         source.print();
19         //自定义process 3s间隔
20         SingleOutputStreamOperator<String> out = source.keyBy("sensorId").process(new MyProcess(3));
21         //报警
22         out.print();
23         //执行
24         env.execute();
25     }
26 }

 

posted @ 2022-03-04 21:26  CHANG_09  阅读(474)  评论(0)    收藏  举报