package com.moral.api.kafka.consumer;
|
|
import com.alibaba.fastjson.JSON;
|
import com.moral.api.entity.Device;
|
import com.moral.api.entity.Sensor;
|
import com.moral.api.websocket.SingleDeviceServer;
|
import org.apache.kafka.clients.consumer.Consumer;
|
import org.apache.kafka.clients.consumer.ConsumerRecord;
|
import org.apache.kafka.common.TopicPartition;
|
import org.springframework.kafka.annotation.KafkaListener;
|
import org.springframework.kafka.listener.ConsumerSeekAware;
|
import org.springframework.stereotype.Component;
|
|
import java.util.HashMap;
|
import java.util.List;
|
import java.util.Map;
|
import java.util.concurrent.CopyOnWriteArraySet;
|
|
/**
|
* @ClassName SecondsDataConsumer1
|
* @Description TODO
|
* @Author 陈凯裕
|
* @Date 2021/6/15 14:49
|
* @Version TODO
|
**/
|
@Component
|
public class SecondDataConsumer implements ConsumerSeekAware {
|
|
@KafkaListener(topics = "second_data",groupId = "SecondsDataGroup3")
|
public void listen(ConsumerRecord<String, String> record , Consumer consumer) throws Exception {
|
String messageStr = record.value();
|
Map<String,String> message = (Map<String,String>)JSON.parse(messageStr);
|
//System.out.println(message);
|
CopyOnWriteArraySet<SingleDeviceServer> sockets = SingleDeviceServer.sockets;
|
for (SingleDeviceServer socket : sockets) {
|
//判断消息书否数据该socket
|
//取出基本信息
|
String mac = socket.getMac();
|
Map<String, Device> devicesInfo = socket.getDevicesInfo();
|
Device device = devicesInfo.get(mac);
|
//创建最终消息对象
|
Map<String,String> resultMessgae = new HashMap<>();
|
//拼接单位
|
List<Sensor> sensors = device.getVersion().getSensors();//获取型号所有因子信息
|
for (Sensor sensor : sensors) {
|
String code = sensor.getCode();
|
String showUnit = sensor.getShowUnit();
|
//单位转换
|
//拼接单位
|
String value = message.get(code);
|
value+=showUnit;
|
resultMessgae.put(sensor.getCode(),value);
|
}
|
resultMessgae.put("DataTime",message.get("DataTime"));
|
socket.sendMessage(JSON.toJSONString(resultMessgae));
|
}
|
}
|
|
@Override
|
public void registerSeekCallback(ConsumerSeekCallback consumerSeekCallback) {
|
|
}
|
|
//consumer回调函数,设置从最新的offset开始消费
|
@Override
|
public void onPartitionsAssigned(Map<TopicPartition, Long> map, ConsumerSeekCallback consumerSeekCallback) {
|
map.forEach((t, o) -> consumerSeekCallback.seekToEnd(t.topic(), t.partition()));
|
}
|
|
@Override
|
public void onIdleContainer(Map<TopicPartition, Long> map, ConsumerSeekCallback consumerSeekCallback) {
|
|
}
|
}
|