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.entity.UnitConversion;
|
import com.moral.api.websocket.SingleDeviceServer;
|
import com.moral.util.UnitConvertUtils;
|
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 org.springframework.util.ObjectUtils;
|
|
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 = "SecondsDataGroup996")
|
public void listen(ConsumerRecord<String, String> record, Consumer consumer) throws Exception {
|
String messageStr = record.value();
|
Map<String, Object> message = (Map<String, Object>) JSON.parse(messageStr);
|
long serverStartTime = System.currentTimeMillis();
|
CopyOnWriteArraySet<SingleDeviceServer> sockets = SingleDeviceServer.sockets;
|
for (SingleDeviceServer socket : sockets) {
|
//判断消息书否数据该socket
|
String messageMac = (String) message.get("mac");
|
String mac = socket.getMac();
|
if(!mac.equalsIgnoreCase(messageMac))
|
continue;
|
//取出基本信息
|
Map<String, Device> devicesInfo = socket.getDevicesInfo();
|
Device device = devicesInfo.get(mac);
|
//创建最终消息对象
|
Map<String, Object> resultMessgae = new HashMap<>();
|
//拼接单位
|
List<Sensor> sensors = device.getVersion().getSensors();//获取型号所有因子信息
|
for (Sensor sensor : sensors) {
|
String code = sensor.getCode();
|
String showUnit = sensor.getShowUnit();
|
String showUnitKey = sensor.getShowUnitKey();
|
String unitKey = sensor.getUnitKey();
|
String unit = sensor.getUnit();
|
String sourceData = String.valueOf(message.get(code));
|
//数据补偿
|
//单位转换
|
if (!unitKey.equals(showUnitKey)) {//如果源单位和显示单位不同,则进行单位转换
|
String formula = sensor.getFormula();
|
//如果sensor中的公式为空则从缓存中获取公式
|
if (ObjectUtils.isEmpty(formula)) {
|
List<UnitConversion> unitConversions = socket.getUnitConversions();
|
for (UnitConversion unitConversion : unitConversions) {
|
if (unitConversion.getOriginalUnitKey().equals(unitKey) && unitConversion.getTargetUnitKey().equals(showUnitKey))
|
formula = unitConversion.getFormula();
|
}
|
}
|
//单位转换
|
String resultData = UnitConvertUtils.calculate(sourceData, formula);
|
if (resultData != null) {
|
resultData+=showUnit;
|
}else{//如果转换出的数据为null,则代表缓存中也没有公式,依然使用源单位。
|
resultData = sourceData+unit;
|
}
|
resultMessgae.put(sensor.getCode(), resultData);
|
} else {
|
//拼接单位
|
sourceData += showUnit;
|
resultMessgae.put(sensor.getCode(), sourceData);
|
}
|
}
|
resultMessgae.put("DataTime",message.get("DataTime"));
|
resultMessgae.put("time",message.get("time"));
|
resultMessgae.put("time1",message.get("time1"));
|
resultMessgae.put("serverTime",System.currentTimeMillis());
|
resultMessgae.put("serverStartTime",serverStartTime);
|
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) {
|
|
}
|
|
}
|