Schedule定时任务

Schedule定时任务。定时执行,将结果放在指定的表中。LineiceSchedule.java 判段装置接受的数据是否为空,过多,过少;判定(EQUAL_ICETHICKNESS )等值覆冰厚度;检查超时接受的数据。MonitorDataSchedule.java 筛选同一id对应的所有IP,和同一IP对应所有id。

方法名上加注解@Scheduled,cron表达式 控制执行时间与频率。例如 @Scheduled(cron = "0 0 2 * * ?")

启动类上加注解@EnableScheduling。

LineiceSchedule.java

package com.evan.schedule;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.HashSet;
import java.util.List;
import java.util.Map;
import java.util.Map.Entry;
import java.util.Set;
import java.util.TimeZone;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Service;

import com.evan.bean.SdCagErrormonitors;
import com.evan.bean.SdCagLineice;
import com.evan.bean.SdCagParam;
import com.evan.constant.Constant;
import com.evan.service.ISdCagErrordatasService;
import com.evan.service.ISdCagErrormonitorsService;
import com.evan.service.ISdCagLineiceService;
import com.evan.service.ISdCagParamService;
import com.evan.service.ITsDeviceService;

@Service
public class LineiceSchedule{
    
    @Autowired
    private ISdCagErrormonitorsService sdCagErrormonitorsService;
    
    @Autowired
    private ISdCagLineiceService sdCagLineiceService;
    
    @Autowired
    private ITsDeviceService tsDeviceService;
    
    @Autowired
    private ISdCagParamService sdCagParamService;
    
    @Autowired
    private ISdCagErrordatasService sdCagErrordatasService;

    /**
     * 判段装置接受的数据是否为空,过多,过少
     */
    @Scheduled(cron = "0 0 2 * * ?")
    public void analyse() {
        
        long end = System.currentTimeMillis()/(1000*3600*24)*(1000*3600*24)-TimeZone.getDefault().getRawOffset();
        long start = end - 24*60*60*1000;
        String type = Constant.MTYPE_LINEICE;
        
        SdCagErrormonitors errormonitors = null;
        List<SdCagErrormonitors> errormonitorsList = null;
        
        List<Map<String, Object>> countList = sdCagLineiceService.getCount(start, end);
        List<String> idList = tsDeviceService.getMonitorsByMtype(type);
        
        //查询前一天错误装置cmdid
        List<String> cmdidErrordataseList = sdCagErrordatasService.getSdCagErrordataseList(start, end);
        //先去除错误装置
        idList.removeAll(cmdidErrordataseList);
        
        SdCagParam sdCagParamLineiceMin = sdCagParamService.getSdCagParam(Constant.PARAM_LINEICE_MIN);
        SdCagParam sdCagParamLineiceMax = sdCagParamService.getSdCagParam(Constant.PARAM_LINEICE_MAX);
        
        float lineiceMin = sdCagParamLineiceMin.getValue();
        float lineiceMax = sdCagParamLineiceMax.getValue();
        
        errormonitorsList = new ArrayList<SdCagErrormonitors>();
        for (String id : idList) {
            int quantity = 0;
            for (Map<String, Object> count : countList) {
                if (id.equals(count.get("cmdId"))) {
                    quantity = ((Long)count.get("quantity")).intValue();
                    break;
                }
            }
            if (quantity == 0) { 
                errormonitors = new SdCagErrormonitors();
                errormonitors.setCmd_id(id);
                errormonitors.setType(type);
                errormonitors.setError_type(Constant.ERROR_TYPE_EMPTY);
                errormonitors.setTime(start);
                errormonitors.setTime_stamp(start);
                errormonitorsList.add(errormonitors);
            } else if (quantity >= lineiceMax) {
                errormonitors = new SdCagErrormonitors();
                errormonitors.setCmd_id(id);
                errormonitors.setType(type);
                errormonitors.setError_type(Constant.ERROR_TYPE_CNT_TOOHIGH);
                errormonitors.setError_msg("当前数据量:" + quantity + ";最大数据量:" + lineiceMax);
                errormonitors.setTime(start);
                errormonitors.setTime_stamp(start);
                errormonitorsList.add(errormonitors);
            } else if (quantity > 0 && quantity < lineiceMin) {
                errormonitors = new SdCagErrormonitors();
                errormonitors.setCmd_id(id);
                errormonitors.setType(type);
                errormonitors.setError_type(Constant.ERROR_TYPE_CNT_TOOLOW);
                errormonitors.setError_msg("当前数据量:" + quantity + ";最小数据量:" + lineiceMin);
                errormonitors.setTime(start);
                errormonitors.setTime_stamp(start);
                errormonitorsList.add(errormonitors);
            }
        }
        
        sdCagErrormonitorsService.deleteSdCagErrormonitors(type, Constant.ERROR_TYPE_EMPTY, start, end);
        sdCagErrormonitorsService.deleteSdCagErrormonitors(type, Constant.ERROR_TYPE_CNT_TOOHIGH, start, end);
        sdCagErrormonitorsService.deleteSdCagErrormonitors(type, Constant.ERROR_TYPE_CNT_TOOLOW, start, end);
        boolean state = sdCagErrormonitorsService.batchAddSdCagErrormonitors(errormonitorsList);
        
        System.out.println("Lineice----" + state);
        
    }
        
    
    /**
     * 判定   EQUAL_ICETHICKNESS 等值覆冰厚度
     */
    @Scheduled(cron = "0 0 2 * * ?")
    public void analyseIcethickness() {
        
        long end = System.currentTimeMillis()/(1000*3600*24)*(1000*3600*24)-TimeZone.getDefault().getRawOffset();
        long start = end - 24*60*60*1000;
        String type = Constant.MTYPE_LINEICE;
        
        List<String> idList = tsDeviceService.getMonitorsByMtype(type);
        //查询前一天错误装置cmdid
        List<String> cmdidErrordataseList = sdCagErrordatasService.getSdCagErrordataseList(start, end);
        idList.removeAll(cmdidErrordataseList);
        List<SdCagLineice> lineiceList = sdCagLineiceService.getSdCagLineiceList(start, end);
        
        float icethicknessMin = (sdCagParamService.getSdCagParam(Constant.PARAM_ICETHICKNESS_MIN)).getValue();
        float icethicknessMax = (sdCagParamService.getSdCagParam(Constant.PARAM_ICETHICKNESS_MAX)).getValue();
        
        List<SdCagErrormonitors> errormonitorsList = new ArrayList<SdCagErrormonitors>();
        Map<String, Set<Double>> icethicknessMap = new HashMap<String,Set<Double>>();
        for(String id : idList) {
            Set<Double> icethicknessSet = new HashSet<Double>();
            for(SdCagLineice lineice : lineiceList) {
                if(id.equals(lineice.getCmd_id())) {
                    icethicknessSet.add(lineice.getEqual_icethickness());
                }
            }
            icethicknessMap.put(id, icethicknessSet);
        }
        
        
        for(String id : idList) {
            for(SdCagLineice lineice : lineiceList) {
                if(id.equals(lineice.getCmd_id())) {
                    if(lineice.getEqual_icethickness() > icethicknessMax) {
                        SdCagErrormonitors errormonitors = new SdCagErrormonitors();
                        errormonitors.setCmd_id(id);
                        errormonitors.setType(type);
                        errormonitors.setError_type(Constant.ERROR_TYPE_DATA_TOOHIGH);
                        errormonitors.setError_msg("等值覆冰厚度过高,数据值为:" + lineice.getEqual_icethickness());
                        errormonitors.setTime(start);
                        errormonitors.setTime_stamp(start);
                        errormonitorsList.add(errormonitors);
                    }
                    if(lineice.getEqual_icethickness() < icethicknessMin) {
                        SdCagErrormonitors errormonitors = new SdCagErrormonitors();
                        errormonitors.setCmd_id(id);
                        errormonitors.setType(type);
                        errormonitors.setError_type(Constant.ERROR_TYPE_DATA_TOOLOW);
                        errormonitors.setError_msg("等值覆冰厚度过低,数据值为:" + lineice.getEqual_icethickness());
                        errormonitors.setTime(start);
                        errormonitors.setTime_stamp(start);
                        errormonitorsList.add(errormonitors);
                    }
                }
            }
        }
        
        for(Map.Entry<String, Set<Double>> entry : icethicknessMap.entrySet()) {
            List<Double> icethicknessList = new ArrayList<Double>(entry.getValue());
            if(entry.getValue() != null && entry.getValue().size() == 1 && icethicknessList.get(0) != 0.0) {
                SdCagErrormonitors errormonitors = new SdCagErrormonitors();
                errormonitors.setCmd_id(entry.getKey());
                errormonitors.setType(type);
                errormonitors.setError_type(Constant.ERROR_TYPE_UNCHANGED);
                errormonitors.setError_msg("等值覆冰厚度恒定为:" + icethicknessList.get(0));
                errormonitors.setTime(start);
                errormonitors.setTime_stamp(start);
                errormonitorsList.add(errormonitors);
            }
        }
        sdCagErrormonitorsService.deleteSdCagErrormonitors(type, Constant.ERROR_TYPE_UNCHANGED, start, end);
        sdCagErrormonitorsService.deleteSdCagErrormonitors(type, Constant.ERROR_TYPE_DATA_TOOHIGH, start, end);
        sdCagErrormonitorsService.deleteSdCagErrormonitors(type, Constant.ERROR_TYPE_DATA_TOOLOW, start, end);
        boolean state = sdCagErrormonitorsService.batchAddSdCagErrormonitors(errormonitorsList);
        System.out.println("analyseIcethickness----" + state);
    }
    
    /**
      * 检查超时接受的数据
     **/
    @Scheduled(cron = "0 0 2 * * ?")
    public void checkRecvtime() {
        
        long end = System.currentTimeMillis()/(1000*3600*24)*(1000*3600*24)-TimeZone.getDefault().getRawOffset();
        long start = end - 24*60*60*1000;
        String type = Constant.MTYPE_LINEICE;
        
        //查询前一天错误装置cmdid
        List<String> cmdidErrordataseList = sdCagErrordatasService.getSdCagErrordataseList(start, end);
        
        SdCagErrormonitors errormonitors = null;
        List<SdCagLineice> lineiceList = sdCagLineiceService.getSdCagLineiceList(start, end);
        
        SdCagParam recvtimeInvalid = sdCagParamService.getSdCagParam(Constant.PARAM_RECVTIME_INVALID);
        float recvtimeInvalidVal = recvtimeInvalid.getValue();
        SdCagParam frequency = sdCagParamService.getSdCagParam(Constant.PARAM_RECVTIME_FREQUENCY);
        int frequencyVal = (int) frequency.getValue();
        
        Map<String, Integer> lineiceMap = new HashMap<String, Integer>();
        int i = 1;
        for(SdCagLineice lineice :lineiceList) {
            float timeChange = (lineice.getRecvtime()-lineice.getTime_stamp())/1000/60;
            if(!cmdidErrordataseList.contains(lineice.getCmd_id()) && timeChange > recvtimeInvalidVal) {
                if (lineiceMap.containsKey(lineice.getCmd_id())) {
                    Integer idNum = lineiceMap.get(lineice.getCmd_id());
                    lineiceMap.put(lineice.getCmd_id(), ++idNum);
                } else {
                    lineiceMap.put(lineice.getCmd_id(), i);
                }
            }
        }
        
        List<SdCagErrormonitors> recvtimeList = new ArrayList<SdCagErrormonitors>();
        for (Entry<String, Integer> entry : lineiceMap.entrySet()) {
            if (entry.getValue() > frequencyVal) {
                errormonitors = new SdCagErrormonitors();
                errormonitors.setCmd_id(entry.getKey());
                errormonitors.setType(type);
                errormonitors.setError_type(Constant.ERROR_TYPE_RECVTIME_INVALID);
                errormonitors.setError_msg("当前数据量:"+entry.getValue()+"条;容错量:"+frequencyVal + "条");
                errormonitors.setTime(start);
                errormonitors.setTime_stamp(start);
                recvtimeList.add(errormonitors);
            }
        }
        
        sdCagErrormonitorsService.deleteSdCagErrormonitors(type, Constant.ERROR_TYPE_RECVTIME_INVALID, start, end);
        boolean state = sdCagErrormonitorsService.batchAddSdCagErrormonitors(recvtimeList);
        
        System.out.println("Lineice--checkRecvtime" + state);
        
    }
    
}

MonitorDataSchedule.java

package com.evan.schedule;

import java.util.ArrayList;
import java.util.HashSet;
import java.util.List;
import java.util.Set;
import java.util.TimeZone;
import java.util.stream.Collectors;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Service;

import com.evan.bean.SdCagErrordatas;
import com.evan.bean.SdCagFromipId;
import com.evan.bean.VMonitorData;
import com.evan.constant.Constant;
import com.evan.service.ISdCagErrordatasService;
import com.evan.service.ISdCagFromipIdService;

@Service
public class MonitorDataSchedule{
    
    @Autowired
    private ISdCagErrordatasService sdCagErrordatasService;
    
    @Autowired
    private ISdCagFromipIdService sdCagFromipIdservice;

    @Scheduled(cron = "0 30 2 * * ?")
    public void analyseMonitorData() {
        
        long begin = System.currentTimeMillis();
        long end = System.currentTimeMillis()/(1000*3600*24)*(1000*3600*24)-TimeZone.getDefault().getRawOffset();
        long start = end - 24*60*60*1000;
        
        String sameId = Constant.ERROR_IP_SAMEID;
        String sameIp = Constant.ERROR_IP_SAMEIP;
        
        SdCagErrordatas sdCagErrordatas = null;
        List<SdCagErrordatas> sdCagErrordatasList= null; 
        
        //防止重复执行产生重复数据
        sdCagErrordatasService.batchDeleteByTime(start, end);
        
        //得到的List中 只包含distinct 后    cmd_id fromip 字段
        List<VMonitorData> vMonitorDataList = sdCagErrordatasService.getMonitorDataList(start, end);
        
        System.out.println(vMonitorDataList.size());
        
        List<String> cmdIdList = new ArrayList<String>();
        List<String> fromipList = new ArrayList<String>();
        
        for(VMonitorData vMonitorData : vMonitorDataList) {
            cmdIdList.add(vMonitorData.getCmd_id());
            fromipList.add(vMonitorData.getFromip() );
        }
        
        //获取装置表fromipid的所有信息
        List<SdCagFromipId> sdCagFromipIdList = sdCagFromipIdservice.getSdCagFromipIdList();
        
        //将id数大于1的筛选出来
        List<String> sameIdList = getDuplicateElements(cmdIdList);
        sdCagErrordatasList = new ArrayList<SdCagErrordatas>();
        
        for(String id : sameIdList) {
            
            List<String> ipList = new ArrayList<String>();
            //取同id对应的ip
            for(VMonitorData vMonitorData :vMonitorDataList) {
                if(id.equals(vMonitorData.getCmd_id())){
                    ipList.add(vMonitorData.getFromip() );
                }
            }
            
            for(String ip:ipList) {
                sdCagErrordatas = new SdCagErrordatas();
                sdCagErrordatas.setCmd_id(id);
                sdCagErrordatas.setFromip(ip);
                sdCagErrordatas.setType(sameId);
                sdCagErrordatas.setError_msg("同一ID:"+id+",对应多个IP"+ipList.toString());
                sdCagErrordatas.setTime_stamp(start);
                sdCagErrordatas.setRecvtime(start);
                sdCagErrordatas.setCreatime(start);
                sdCagErrordatasList.add(sdCagErrordatas);
            }
        }
        sdCagErrordatasService.batchAddSdCagErrordatas(sdCagErrordatasList);
        
        //将fromip数大于1的筛选出来
        List<String> sameIpList = getDuplicateElements(fromipList);
        sdCagErrordatasList = new ArrayList<SdCagErrordatas>();
        //获取同fromip对应的id
        for(String ip : sameIpList) {
            Set<String> poleSet = new HashSet<String>();
            List<String> idList = new ArrayList<String>();
            for(VMonitorData vMonitorData :vMonitorDataList) {
                if(ip.equals(vMonitorData.getFromip())) {
                    idList.add(vMonitorData.getCmd_id());
                    poleSet.add(vMonitorData.getPole_id());
                }
            }
            
            if(poleSet.size() > 1 ) {
                List<String> cmdIdListFromipId = new ArrayList<String>();
                for(SdCagFromipId sdCagFromipId : sdCagFromipIdList) {
                    if(ip.equals(sdCagFromipId.getFromip())){
                        cmdIdListFromipId.add(sdCagFromipId.getCmd_id());
                    }
                }
                
                //求出差集
                idList.removeAll(cmdIdListFromipId);
                
                for(String id:idList) {
                    sdCagErrordatas = new SdCagErrordatas();
                    sdCagErrordatas.setCmd_id(id);
                    sdCagErrordatas.setFromip(ip);
                    sdCagErrordatas.setType(sameIp);
                    sdCagErrordatas.setError_msg("同一IP:"+ip+",对应多个ID"+idList.toString());
                    sdCagErrordatas.setTime_stamp(start);
                    sdCagErrordatas.setRecvtime(start);
                    sdCagErrordatas.setCreatime(start);
                    sdCagErrordatasList.add(sdCagErrordatas);
                }
            }
            
        }
        sdCagErrordatasService.batchAddSdCagErrordatas(sdCagErrordatasList);
        System.out.println("analyseMonitorData 执行时间:" + (System.currentTimeMillis( )- begin));
    }
    
    private List<String> getDuplicateElements(List<String> list) {
        return list.stream()
                    .collect(Collectors.toMap(e -> e, e -> 1, Integer::sum))
                    .entrySet().stream()
                    .filter(entry -> entry.getValue() > 1)
                    .map(entry -> entry.getKey())
                    .collect(Collectors.toList());
   }
    
}
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,293评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,604评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,958评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,729评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,719评论 5 366
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,630评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,000评论 3 397
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,665评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,909评论 1 299
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,646评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,726评论 1 330
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,400评论 4 321
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,986评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,959评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,197评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 44,996评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,481评论 2 342

推荐阅读更多精彩内容