1、factory
package com.pojo.prj.aliyun.lot;
import com.google.common.collect.Maps;
import com.pojo.prj.aliyun.lot.service.DeviceConsumeService;
import com.pojo.common.core.enums.DeviceTypeEnum;
import org.springframework.beans.BeansException;
import org.springframework.beans.factory.InitializingBean;
import org.springframework.context.ApplicationContext;
import org.springframework.context.ApplicationContextAware;
import org.springframework.stereotype.Component;
import java.util.Map;
@Component
public class DeviceServiceFactory implements ApplicationContextAware, InitializingBean {
private ApplicationContext applicationContext;
private static final Map<DeviceTypeEnum, DeviceConsumeService> beansMap = Maps.newConcurrentMap();
public static DeviceConsumeService getInstance(DeviceTypeEnum deviceTypeEnum) {
return beansMap.get(deviceTypeEnum);
}
@Override
public void afterPropertiesSet() {
Map<String, DeviceConsumeService> beansOfType = applicationContext.getBeansOfType(DeviceConsumeService.class);
for (Map.Entry<String, DeviceConsumeService> entry : beansOfType.entrySet()) {
beansMap.put(entry.getValue().getDeviceType(), entry.getValue());
}
}
@Override
public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
this.applicationContext = applicationContext;
}
}
2、消费接口
package com.pojo.prj.aliyun.lot.service;
import com.alibaba.fastjson.JSONObject;
import com.pojo.common.core.enums.DeviceTypeEnum;
import com.pojo.prj.domain.CarDevice;
import com.pojo.prj.domain.Device;
import java.util.concurrent.TimeUnit;
public interface DeviceConsumeService {
void consume(JSONObject message, String messageId);
DeviceTypeEnum getDeviceType();
}
3、消费接口实现1
package com.pojo.prj.aliyun.lot.service.impl;
import com.alibaba.fastjson.JSONObject;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper;
import com.pojo.common.core.enums.DeviceTypeEnum;
import com.pojo.common.core.utils.CoordinateConvert;
import com.pojo.common.core.utils.GetCityByLocation;
import com.pojo.common.core.utils.LocalDateUtil;
import com.pojo.common.core.utils.StringUtils;
import com.pojo.prj.aliyun.lot.service.DeviceConsumeService;
import com.pojo.prj.domain.*;
import com.pojo.prj.domain.model.CarDeviceReset;
import com.pojo.prj.request.vms.RetryReq;
import com.pojo.prj.service.*;
import lombok.extern.slf4j.Slf4j;
import org.redisson.api.RBucket;
import org.redisson.api.RedissonClient;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.math.BigDecimal;
import java.util.Objects;
import java.util.concurrent.TimeUnit;
@Service
@Slf4j
public class CarConsumeServiceImpl implements DeviceConsumeService {
@Autowired
ProjectService projectService;
@Autowired
CarDeviceService carDeviceService;
@Autowired
RedissonClient redissonClient;
@Autowired
DeviceOperHistoryService deviceOperHistoryService;
@Autowired
CarService carService;
@Autowired
CarWarnTrailService carWarnTrailService;
@Override
public void consume(JSONObject jsonObject, String messageId) {
}
@Override
public DeviceTypeEnum getDeviceType() {
return DeviceTypeEnum.CAR01;
}
}
4、消费接口实现2
package com.pojo.prj.aliyun.lot.service.impl;
import com.alibaba.fastjson.JSONObject;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper;
import com.pojo.common.core.enums.DeviceTypeEnum;
import com.pojo.common.core.utils.CoordinateConvert;
import com.pojo.common.core.utils.GetCityByLocation;
import com.pojo.common.core.utils.LocalDateUtil;
import com.pojo.common.core.utils.StringUtils;
import com.pojo.prj.aliyun.lot.service.DeviceConsumeService;
import com.pojo.prj.domain.CarDevice;
import com.pojo.prj.domain.Device;
import com.pojo.prj.domain.WarnDeviceInfo;
import com.pojo.prj.request.vms.RetryReq;
import com.pojo.prj.service.DeviceOperHistoryService;
import com.pojo.prj.service.DeviceService;
import com.pojo.prj.service.ProjectService;
import lombok.extern.slf4j.Slf4j;
import org.redisson.api.RBucket;
import org.redisson.api.RedissonClient;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.math.BigDecimal;
import java.util.Objects;
import java.util.concurrent.TimeUnit;
@Service
@Slf4j
public class JsdConsumeServiceImpl implements DeviceConsumeService {
@Autowired
ProjectService projectService;
@Autowired
DeviceService deviceService;
@Autowired
RedissonClient redissonClient;
@Autowired
DeviceOperHistoryService deviceOperHistoryService;
@Override
public void consume(JSONObject jsonObject, String messageId) {
}
@Override
public DeviceTypeEnum getDeviceType() {
return DeviceTypeEnum.JSDWG;
}
}
5、枚举
package com.pojo.common.core.enums;
import com.google.common.collect.Maps;
import java.util.Map;
public enum DeviceTypeEnum implements BaseEnum {
VMS01("VMS01", "智慧屏"),
QXCG01("QXCG01", "气象传感"),
ZHLZ01("ZHLZ01", "智能交通锥"),
ZHDT01("ZHDT01", "智能灯带"),
ZNTK01("ZNTK01", "智能头盔"),
BSD01("BSD01", "爆闪灯"),
CZ01("CZ01", "车载"),
SPJK01("SPJK01", "智能摄像机"),
LZGATEWAY("LZWG01", "交通锥网关"),
JSDWG("ZNJSD01", "警示灯网关"), // 实际上为警示灯网关
JSD("ZNJSD02", "智能警示灯"),
ZNJSQ("VMS02", "智能警示器"),
ZNZZB("ZNZZB01", "智能对讲终端"),
SJSD_WG("JSD_WG", "小警示灯网关"),
SJSD("SJSD", "小警示灯"),
ZSP_WG("ZSP_WG", "导向牌网关"),
WT01("4GWT01", "4G对讲机"),
LMD("LMD", "龙门吊"),
TD("TD", "塔吊"),
ZNSH("ZNSH", "智能手环"),
WD_WG("WD_WG", "雾灯网关"),
UAV("UAV", "无人机"),
CAR01("CAR01","车顶预警器"),
WD("WD", "雾灯");
private String code;
private String desc;
public static final Map<String, String> codeDescMap = getCodeDescMap();
public static final Map<String, String> descCodeMap = getDescCodeMap();
DeviceTypeEnum(String code, String desc) {
this.code = code;
this.desc = desc;
}
public static DeviceTypeEnum getValue(String code) {
for (DeviceTypeEnum typeEnum : values()) {
if (code.equals(typeEnum.getCode())) {
return typeEnum;
}
}
return null;
}
public static Map<String, String> getDescCodeMap() {
Map<String, String> map = Maps.newHashMap();
for (DeviceTypeEnum deviceType : values()) {
map.put(deviceType.getDesc(), deviceType.getCode());
}
return map;
}
public static Map<String, String> getCodeDescMap() {
Map<String, String> map = Maps.newHashMap();
for (DeviceTypeEnum deviceType : values()) {
map.put(deviceType.getCode(), deviceType.getDesc());
}
return map;
}
@Override
public String getDesc() {
return desc;
}
@Override
public String getCode() {
return code;
}
}
6、使用
package com.pojo.prj.aliyun.ons;
import com.alibaba.fastjson.JSONObject;
import com.aliyun.openservices.ons.api.Action;
import com.aliyun.openservices.ons.api.ConsumeContext;
import com.aliyun.openservices.ons.api.Message;
import com.aliyun.openservices.ons.api.MessageListener;
import com.google.common.collect.Lists;
import com.pojo.common.core.enums.DeviceTypeEnum;
import com.pojo.common.core.utils.LocalDateUtil;
import com.pojo.common.core.utils.StringUtils;
import com.pojo.prj.aliyun.lot.DeviceServiceFactory;
import com.pojo.prj.aliyun.lot.service.DeviceConsumeService;
import com.pojo.prj.task.DeviceConsumeTask;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Component;
import java.nio.charset.StandardCharsets;
import java.util.List;
import java.util.Objects;
@Component
@Slf4j
public class TcpMessageListener implements MessageListener {
@Override
public Action consume(Message message, ConsumeContext consumeContext) {
String msg = new String(message.getBody(), StandardCharsets.UTF_8);
String messageId = message.getMsgID();
JSONObject object = JSONObject.parseObject(msg);
String devicetype = object.getString("devicetype");
if (Objects.equals(devicetype, DeviceTypeEnum.JSD.getCode())) {
devicetype = DeviceTypeEnum.JSDWG.getCode();
object.put("devicetype", devicetype);
}
if (devicetype.contains(DeviceTypeEnum.CAR01.getCode())) {
devicetype = DeviceTypeEnum.CAR01.getCode();
object.put("devicetype", devicetype);
}
List<String> deviceTypes = Lists.newArrayList(DeviceTypeEnum.JSDWG.getCode(),
DeviceTypeEnum.VMS01.getCode(), DeviceTypeEnum.ZHDT01.getCode(),
DeviceTypeEnum.ZNJSQ.getCode(), DeviceTypeEnum.CAR01.getCode());
log.error("消费消息" + devicetype + "====" + messageId + "时间==" + LocalDateUtil.getTimeStr(message.getBornTimestamp()));
if (StringUtils.isNotBlank(devicetype) && deviceTypes.contains(devicetype)) {
DeviceConsumeService service = DeviceServiceFactory.getInstance(DeviceTypeEnum.getValue(devicetype));
if (Objects.nonNull(service)) {
DeviceConsumeTask deviceConsumeTask = DeviceConsumeTask.builder()
.deviceConsumeService(service)
.messageId(messageId)
.msg(object).build();
DeviceConsumeTask.queueThreadPool.execute(deviceConsumeTask);
}
}
return Action.CommitMessage;
}
}