接口多实现类

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;
    }
}

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

非ban必选

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值