springcloud/springboot+定时任务

本文介绍了一个基于Spring框架的Quartz定时任务实现,用于处理物联网(IoT)设备发送的数据。通过解析JSON消息,将数据转换为特定的实体类并存储到数据库中,同时展示了如何处理不同类型的IoT消息。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

package com.nari.iot.schedule;

import java.math.BigDecimal;
import java.sql.Timestamp;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.*;

import com.nari.iot.bean.Info_Ai;
import com.nari.iot.bean.IotAirElec;
import com.nari.iot.bean.IotAirInfo;
import com.nari.iot.bean.Message;
import com.nari.iot.common.config.ApplicationContextProvider;
import com.nari.iot.service.IotAirInfoService;
import com.nari.iot.tools.Common;
import com.nari.iot.tools.JsonUtils;
import org.apache.commons.lang3.StringUtils;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Component;
import com.nari.iot.tools.JedisUtils;
/***
 * Quartz设置项目全局的定时任务
 * @Component注解的意义        泛指组件,当组件不好归类的时候,我们可以使用这个注解进行标注。一般公共的方法我会用上这个注解
 * @author ZMJ
 */
@Component
public class QuartzSchedule {

//    @Scheduled(cron = "0 0/1 * * * ?") // 每分钟执行一次
//    public void work() throws Exception {
//        System.out.println("执行调度任务:"+new Date());
//    }
    private IotAirInfoService iotAirInfoService = ApplicationContextProvider.getBean(IotAirInfoService.class);


    public void saveAirInfo(List<Info_Ai> infoAiList){

        if(infoAiList != null && infoAiList.size() > 0){
            List<IotAirInfo> infoList = new ArrayList<IotAirInfo>();
            Map<String, IotAirInfo> infoMap = new HashMap<String, IotAirInfo>();
            for(int i = 0; i< infoAiList.size(); i++){
                //获得消息AI实体
                Info_Ai infoAi = infoAiList.get(i);
                String key = infoAi.getKey();
                String name = infoAi.getName();
                String value = infoAi.getValue().trim();
                String ref_time = infoAi.getRef_time();
                //解析AI消息
                String[] split = key.split("-"); // m1   1_ai_0
                String[] split1 = split[1].split("_"); //1  ai  0
                String floor = split[0].substring(1);
                String room = split1[0];
                String flag = split1[2];

                String[] collectArr = key.split("_");
                IotAirInfo iotAirInfo = null;
                if(infoMap.containsKey(collectArr[0])){
                    iotAirInfo = infoMap.get(collectArr[0]);
                }else{
                    iotAirInfo = new IotAirInfo();
                    //封装空调信息实体
                    iotAirInfo.setUuid(Common.getUUID());
                    iotAirInfo.setAirFloor(floor);
                    iotAirInfo.setAirRoom(room);
                    infoMap.put(collectArr[0], iotAirInfo);
                }
                if(Integer.parseInt(flag) == 0){
                    //设置温度值
                    iotAirInfo.setMakeVal(new BigDecimal(value));
                }else if(Integer.parseInt(flag) == 1){
                    //测量温度值
                    iotAirInfo.setMeasureVal(new BigDecimal(value));
                }else{
                    //错误代码值
                    iotAirInfo.setErrorCode(new BigDecimal(value));
                }

                //转换时间格式
//                ref_time = ref_time.replace("Z", " UTC");//注意是空格+UTC
//                SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss Z");//注意格式化的表达式
//                Date d = null;
//                try {
//                    d = format.parse(ref_time);
//                } catch (ParseException e) {
//                    e.printStackTrace();
//                }
                ref_time = ref_time.replace("Z", "").replace("T", " ");//注意是空格+UTC
                SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
                Date parse = null;
                try {
                    parse = sdf.parse(ref_time);
                } catch (ParseException e) {
                    e.printStackTrace();
                }
                iotAirInfo.setCollectTime(parse);
            }
            for(String key: infoMap.keySet()){
                IotAirInfo iotAirInfo = infoMap.get(key);
                if(iotAirInfo.getMeasureVal() == null || iotAirInfo.getMeasureVal().compareTo(BigDecimal.ZERO) == 0
                        || iotAirInfo.getMakeVal() == null || iotAirInfo.getMakeVal().compareTo(BigDecimal.ZERO) == 0){
                    continue;
                }
                infoList.add(iotAirInfo);
            }

            if(infoList.size() > 0){
                iotAirInfoService.insertInfoBatch(infoList);
            }
        }
    }

    public void saveElecInfo(List<Info_Ai> infoAiList){
        //循环ai消息,封装空调消息实体类
        if(infoAiList != null && infoAiList.size() > 0){
            List<IotAirElec> elecList = new ArrayList<IotAirElec>();
            for(int i = 0; i< infoAiList.size(); i++){
                //获得消息AI实体
                Info_Ai infoAi = infoAiList.get(i);
                String key = infoAi.getKey();
                String name = infoAi.getName();
                String value = infoAi.getValue().trim();
                String ref_time = infoAi.getRef_time();
                //电力数据
                IotAirElec iotAirElec = new IotAirElec();
                iotAirElec.setUuid(Common.getUUID());
                iotAirElec.setQuotaKey(key);
                iotAirElec.setQuotaEn(name);
                iotAirElec.setMeasureVal(new BigDecimal(value));
                //转换时间格式
//                ref_time = ref_time.replace("Z", " UTC");//注意是空格+UTC
//                SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss Z");//注意格式化的表达式
//                Date d = null;
//                try {
//                    d = format.parse(ref_time);
//                } catch (ParseException e) {
//                    e.printStackTrace();
//                }
                ref_time = ref_time.replace("Z", "").replace("T", " ");//注意是空格+UTC
                SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
                Date parse = null;
                try {
                    parse = sdf.parse(ref_time);
                } catch (ParseException e) {
                    e.printStackTrace();
                }
                iotAirElec.setCollectTime(parse);
                elecList.add(iotAirElec);
            }
            if(elecList.size() > 0){
                iotAirInfoService.insertElecBatch(elecList);
            }
        }
    }

    public void analyMessage(String type){
        //获取redis缓存的消息,并且将json映射成bean
        String message = JedisUtils.get(type);
        Message messageIns = JsonUtils.toBean(message, Message.class);
        if(messageIns == null){
            return;
        }
        //循环ai消息,封装空调消息实体类
        List<Info_Ai> infoAiList = messageIns.getInfo_ai();
        if(Common.CS_IOT_MESSAGE_INFO.equals(type)){
            saveAirInfo(infoAiList);
        }else if(Common.CS_IOT_MESSAGE_ELEC.equals(type)){
            saveElecInfo(infoAiList);
        }else if(Common.CS_IOT_MESSAGE_MIX.equals(type)){

            List<Info_Ai>  infoList = new ArrayList<Info_Ai>();
            List<Info_Ai> elecList = new ArrayList<Info_Ai>();
            for(int i = 0; i < infoAiList.size(); i++){
                Info_Ai infoAi = infoAiList.get(i);
                String key = infoAi.getKey();
                if(key.indexOf("pi") != -1){
                    elecList.add(infoAi);
                }else{
                    infoList.add(infoAi);
                }
            }
            saveAirInfo(infoList);
            saveElecInfo(elecList);
        }

    }

    @Scheduled(fixedRate = 10000)//每5秒执行一次
    public void play() throws Exception {
        System.out.println("每10秒执行一个的定时任务:"+new Date());
        analyMessage(Common.CS_IOT_MESSAGE_INFO);
        analyMessage(Common.CS_IOT_MESSAGE_ELEC);
        analyMessage(Common.CS_IOT_MESSAGE_MIX);

    }



//    @Scheduled(cron = "0/2 * * * * ?") //每2秒执行一次
//    public void doSomething() throws Exception {
//        System.out.println("每2秒执行一个的定时任务:"+new Date());
//    }




//    @Scheduled(cron = "0 0 0/1 * * ? ") // 每一小时执行一次
//    public void goWork() throws Exception {
//        System.out.println("每一小时执行一次的定时任务:"+new Date());
//    }




}



 这里面涉及到自动注入和json转bean,还有mqtt消息队列的地方,请参考我的其他博客!

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值