1 package com;
2 import lombok.AllArgsConstructor;
3 import lombok.Data;
4 import lombok.NoArgsConstructor;
5 @Data
6 @AllArgsConstructor
7 @NoArgsConstructor
8 public class Sensor {
9 private String sensorId;
10 private Long sensorTime;
11 private Double sensorTemp;
12 }
1 package com;
2
3
4 import org.apache.flink.streaming.api.functions.source.SourceFunction;
5 import java.util.HashMap;
6 import java.util.Random;
7
8 public class MySource implements SourceFunction<Sensor> {
9
10 //基础温度
11 private Integer base;
12 //构造
13 public MySource(Integer base){
14 this.base=base;
15 }
16
17 //开关
18 private Boolean running = true;
19 //随机数
20 private Random random = new Random();
21
22 @Override
23 public void run(SourceContext<Sensor> sourceContext) throws Exception {
24 //stmap<sensorId,temperature>
25 HashMap<String, Double> stmap = new HashMap<>();
26 //10个一组,初始化
27 for (int i = 0; i < 10; i++) {
28 stmap.put("sensor_"+(i+1),base*1.0) ;
29 }
30
31 while (running){
32 for (String id : stmap.keySet()) {
33 //重新生成随机温度,满足正态分布
34 double newTemp = stmap.get(id) + random.nextGaussian()*20;
35 stmap.put(id,newTemp);
36 //封装成传感器对象
37 Sensor sensor = new Sensor(id, System.currentTimeMillis(), newTemp);
38 //进流
39 sourceContext.collect(sensor);
40 //每秒1个
41 Thread.sleep(1000);
42 }
43 }
44 }
45
46 @Override
47 public void cancel() {
48 //关停
49 running = false;
50
51 }
52 }
1 package com;
2
3 import org.apache.flink.streaming.api.functions.ProcessFunction;
4 import org.apache.flink.util.Collector;
5 import org.apache.flink.util.OutputTag;
6
7 //自定义process算子
8 public class MyProcess extends ProcessFunction<Sensor,Sensor> {
9
10 //分流依据
11 private Double temperature;
12 public MyProcess(Double temperature){
13 this.temperature=temperature;
14 }
15
16 @Override
17 public void processElement(Sensor sensor, Context context, Collector<Sensor> collector) throws Exception {
18 if (sensor.getSensorTemp()>temperature){
19 //主流
20 collector.collect(sensor);
21 }else {
22 //存入侧输出标签
23 context.output(new OutputTag<Sensor>("low"){},sensor);
24 }
25
26 }
27 }
1 package com;
2
3 import org.apache.flink.streaming.api.datastream.DataStream;
4 import org.apache.flink.streaming.api.datastream.SingleOutputStreamOperator;
5 import org.apache.flink.streaming.api.environment.StreamExecutionEnvironment;
6 import org.apache.flink.streaming.api.functions.timestamps.BoundedOutOfOrdernessTimestampExtractor;
7 import org.apache.flink.streaming.api.windowing.time.Time;
8 import org.apache.flink.util.OutputTag;
9 //测试类
10 public class MyTest {
11 public static void main(String[] args) {
12 StreamExecutionEnvironment env = StreamExecutionEnvironment.getExecutionEnvironment();
13 env.setParallelism(1);
14 //获取自定义类数据源,以60度正态分布
15 DataStream<Sensor> data = env.addSource(new MySource(60));
16 //水位线允许1s延迟
17 SingleOutputStreamOperator<Sensor> datas = data.assignTimestampsAndWatermarks(new BoundedOutOfOrdernessTimestampExtractor<Sensor>(Time.seconds(1)) {
18 @Override
19 public long extractTimestamp(Sensor sensor) {
20 return sensor.getSensorTime() * 1000;
21 }
22 });
23 //自定义process,分流判断依据60.0摄氏度
24 SingleOutputStreamOperator<Sensor> res = datas.process(new MyProcess(60.0));
25 //根据id:low获得侧输出流
26 DataStream<Sensor> sideOutput = res.getSideOutput(new OutputTag<Sensor>("low") {});
27 //主流输出
28 res.print("high");
29 //侧流输出
30 sideOutput.print("low");
31
32 try {
33 env.execute();
34 } catch (Exception e) {
35 e.printStackTrace();
36 }
37 }
38 }