package io.github.pnoker.gateway.comtool; import com.alibaba.fastjson.JSONArray; import com.alibaba.fastjson.JSONObject; import io.github.pnoker.gateway.bizmgr.*; import io.github.pnoker.gateway.dbdao.DBMgrProxy; import io.github.pnoker.gateway.utils.InfulxDbUtil; import io.github.pnoker.gateway.utils.InfulxJiangjinDbUtil; import io.github.pnoker.gateway.utils.InfulxTyDbUtil; import io.github.pnoker.gateway.utils.InfulxZilaishuiDbUtil; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Value; import org.springframework.scheduling.annotation.EnableAsync; import org.springframework.scheduling.annotation.EnableScheduling; import org.springframework.scheduling.annotation.Scheduled; import org.springframework.stereotype.Component; import org.springframework.web.bind.annotation.PostMapping; import javax.annotation.PostConstruct; import javax.annotation.Resource; import java.sql.Time; import java.time.LocalDate; import java.time.LocalDateTime; import java.time.LocalTime; import java.time.format.DateTimeFormatter; import java.time.temporal.TemporalAdjusters; import java.util.Timer; import java.util.TimerTask; import java.util.concurrent.Executors; import java.util.concurrent.ScheduledExecutorService; import java.util.concurrent.TimeUnit; /** * @ClassName ScheduleTaskMgr * @Description: TODO 定时任务 * @Author LX * @Date 2024/2/20 * @Version V1.0 **/ @Component @EnableScheduling // 1.开启定时任务 @EnableAsync // 2.开启多线程 public class ScheduleTaskMgr { private final String mBusinessType = "class"; private String mStrClassName; public ScheduleTaskMgr() { mStrClassName = this.getClass().getSimpleName(); } private static final Logger log = LoggerFactory.getLogger(ScheduleTaskMgr.class); @Resource private XuchangWaterConfig xuchangWaterConfig; /** * 许昌相关 */ // //TODO 启动时,判断当前是否超过两点 如果超过 ,查询昨日是否有数据插入, 如果没有,则在启动时执行一下xuchangWaterConfig.init() // @PostConstruct // public void postInit(){ // new Timer().schedule(new TimerTask() { // @Override // public void run() { // DBMgrProxy.getInstance().init(); // } // },3000); // new Timer().schedule(new TimerTask() { // @Override // public void run() { // xuchangWaterConfig.init(); // } // },10000); // } // // // // @Scheduled(cron = "0 15 10 * * ?") // @Scheduled(cron = "0 10 12 * * ?") // public void checkXuchangMeter(){ // xuchangWaterConfig.init(); // } //TODO 当阳相关 @Resource(name = "infulxDbUtil") private InfulxDbUtil infulxDbUtil; @Value("${dangyang.device.type:}") private String deviceTypeStr = ""; // 设备类型集合 @Value("${dangyang.http.username:}") private String username = ""; // token调用账号 @Value("${dangyang.http.password:}") private String password = ""; // token调用密码 @Value("${dangyang.http.token:}") private String tokenUrl = ""; // token接口地址 @Value("${dangyang.http.realtimeDataList:}") private String realtimeDataListUrl = ""; // 实时数据接口地址 @Value("${dangyang.http.hisDataList:}") private String hisDataListUrl = ""; // 历史数据接口地址 @Value("${dangyang.http.list:}") private String listUrl = ""; // 设备列表接口地址 /** * 当阳相关 */ // //TODO 启动后5秒初始化所有配置参数 // @PostConstruct // public void initDangyangApplication(){ // new Timer().schedule(new TimerTask() { // @Override // public void run() { // try { // infulxDbUtil.initInfluxDataBase(); // KprDangyangWaterBizFun.infulxDbUtil = infulxDbUtil; // KprDangyangWaterBizFun.deviceType = JSONArray.parseArray(deviceTypeStr); // KprDangyangWaterBizFun.username = username; // KprDangyangWaterBizFun.password = password; // KprDangyangWaterBizFun.tokenUrl = tokenUrl; // KprDangyangWaterBizFun.realtimeDataListUrl = realtimeDataListUrl; // KprDangyangWaterBizFun.hisDataListUrl = hisDataListUrl; // KprDangyangWaterBizFun.listUrl = listUrl; // }catch(Exception ex){ // log.error("当阳启动时初始化配置参数失败:"+ex.getLocalizedMessage()); // } // } // },5000); // } // // //TODO 根据失效时间定时获取token // //TODO 启动后8秒获取第一次token,在以失效时间为基础-5分钟为下一次获取token的条件 // private ScheduledExecutorService scheduler = Executors.newSingleThreadScheduledExecutor(); // private static final long INITIAL_DELAY = 8; // 初始延迟8秒 // private static final long BUFFER_TIME = 5 * 60 * 1000; // 5分钟的缓冲时间(以毫秒为单位) // // @PostConstruct // public void getToken() { // scheduler.schedule(new TokenTask(), INITIAL_DELAY, TimeUnit.SECONDS); // } // // private class TokenTask implements Runnable { // @Override // public void run() { // // 获取 accessToken 和 expiresTime // JSONObject data = KprDangyangWaterBizFun.getDangyangToken(); // if (data != null) { // String accessToken = data.getString("accessToken"); // Long expiresTime = data.getLong("expiresTime"); // // KprDangyangWaterBizFun.dangyangToken = accessToken; // // // 打印获取到的 token 和过期时间 // System.out.println("Access Token: " + accessToken); // System.out.println("Expires Time: " + expiresTime); // // // 计算下一次获取 token 的延迟时间 // long delayMillis = expiresTime - System.currentTimeMillis() - BUFFER_TIME; // long delaySeconds = delayMillis / 1000; // 转换为秒 // // // 调度下一次任务 // if (delaySeconds > 0) { // scheduler.schedule(this, delaySeconds, TimeUnit.SECONDS); // } else { // // 如果计算出来的延迟时间已经过期,立即执行下一次任务 // scheduler.schedule(this, 0, TimeUnit.SECONDS); // } // } // } // } // // //可以做动态关联,暂时不用了 //// @PostConstruct //// public void initDeviceDefine(){ //// new Timer().schedule(new TimerTask() { //// @Override //// public void run() { //// KprDangyangWaterBizFun.flushDefine(); //// } //// },5000); //// } // // @PostConstruct // public void initReal(){ // new Timer().schedule(new TimerTask() { // @Override // public void run() { // KprDangyangWaterBizFun.checkRealtimeData(); // } // },10000); // } // @PostConstruct // public void initHistory(){ // new Timer().schedule(new TimerTask() { // @Override // public void run() { // KprDangyangWaterBizFun.checkOneMonth(); // } // },11000); // } // @PostConstruct // public void initDingzhiHistory(){ // new Timer().schedule(new TimerTask() { // @Override // public void run() { // KprDangyangWaterBizFun.checkDingzhiHistory(); // } // },12000); // } // // @Scheduled(cron = "0 */10 * * * ?") // public void initToken(){ // JSONObject data = KprDangyangWaterBizFun.getDangyangToken(); // if (data != null) { // String accessToken = data.getString("accessToken"); // Long expiresTime = data.getLong("expiresTime"); // // KprDangyangWaterBizFun.dangyangToken = accessToken; // } // } //TODO 江津相关 /*@Resource(name = "infulxJiangjinDbUtil") private InfulxJiangjinDbUtil infulxJiangjinDbUtil; //TODO 启动后5秒初始化所有配置参数 @PostConstruct public void initJiangjinApplication(){ new Timer().schedule(new TimerTask() { @Override public void run() { try { infulxJiangjinDbUtil.initInfluxDataBase(); KprJiangjinWaterBizfun.infulxJiangjinDbUtil = infulxJiangjinDbUtil; }catch(Exception ex){ log.error("江津启动时初始化配置参数失败:"+ex.getLocalizedMessage()); } } },5000); } @PostConstruct public void initJiangjinHisData(){ new Timer().schedule(new TimerTask() { @Override public void run() { try { KprJiangjinWaterBizfun.InitRealDb(); // KprJiangjinWaterBizfun.InitDeviceFrequency(); }catch(Exception ex){ } } },7000,60000); //TODO 启动时同步当前月一号到当前时间的所有历史数据 new Timer().schedule(new TimerTask() { @Override public void run() { try { KprJiangjinWaterBizfun.initHistoryDb(LocalDate.now().withDayOfMonth(1).atStartOfDay()); // KprJiangjinWaterBizfun.initHistoryDb(LocalDateTime.now().withDayOfMonth(10).withHour(12) // .withMinute(0).withSecond(0)); }catch(Exception ex){ } } },8000); } //TODO 每分钟的第五秒执行 @Scheduled(cron = "5 * * * * ?") public void executeTask() { KprJiangjinWaterBizfun.InitRealDb(); } //TODO 每天凌晨1点执行前一天的 @Scheduled(cron = "0 0 1 * * ?") public void executeHistoryTask() { //TODO 执行前一天的数据到当前 KprJiangjinWaterBizfun.initHistoryDb(LocalDate.now().minusDays(1).atStartOfDay()); } //TODO 江津水量预测相关 //每天每个整点的5分 @Scheduled(cron = "0 5 * * * *") public void executeRecord() { String formattedDateTime = LocalDate.now().minusDays(1) .atStartOfDay() .format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss")); KprJiangjinAimWaterBizFun.initTapWaterData(formattedDateTime); } //每天每个整点的5分 @Scheduled(cron = "0 10 * * * *") public void executeRecordAll() { String formattedDateTime = LocalDate.now().minusDays(1) .atStartOfDay() .format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss")); KprJiangjinAimWaterBizFun.initWaterCollecationReacordAll(formattedDateTime); } //TODO 每天每小时的21分执行预测当前月日小时数据 @Scheduled(cron = "0 21 * * * *") public void executeTbMHourWaterNow() { String time = LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyyy-MM")); // KprJiangjinAimWaterBizFun.insertYuceHourAddData(time); KprJiangjinAimWaterBizFun.insertYuceHourDataScheduled(time); } //TODO 启动时执行一次 @PostConstruct public void initExecuteRecordAndAll(){ String formattedDateTime = LocalDate.now().minusDays(1) .atStartOfDay() .format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss")); Timer timer = new Timer(); // 创建定时器任务 TimerTask timerTask = new TimerTask() { @Override public void run() { KprJiangjinAimWaterBizFun.initTapWaterData(formattedDateTime); } }; timer.schedule(timerTask, 10000); // 10秒后执行一次 Timer timer1 = new Timer(); // 创建定时器任务 TimerTask timerTask1 = new TimerTask() { @Override public void run() { KprJiangjinAimWaterBizFun.initWaterCollecationReacordAll(formattedDateTime); } }; timer1.schedule(timerTask1, 10000); // 10秒后执行一次 } @PostConstruct public void initOneTapWater(){ Timer timer = new Timer(); // 创建定时器任务 TimerTask timerTask = new TimerTask() { @Override public void run() { KprJiangjinAimWaterBizFun.initTapWaterData("2023-11-01 00:00:00"); } }; timer.schedule(timerTask, 10000); // 10秒后执行一次 } @PostConstruct public void initWaterRecordAll(){ Timer timer = new Timer(); TimerTask timerTask1 = new TimerTask() { @Override public void run() { KprJiangjinAimWaterBizFun.initWaterCollecationReacordAll("2023-11-01 00:00:00"); } }; timer.schedule(timerTask1,11000);//11秒后执行一次 } @PostConstruct public void initWaterHour(){ Timer timer = new Timer(); TimerTask timerTask1 = new TimerTask() { @Override public void run() { String time = LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyyy-MM")); KprJiangjinAimWaterBizFun.insertYuceHourDataScheduled(time); } }; timer.schedule(timerTask1,9000);//9秒后执行一次 }*/ /** * TODO 自来水相关 */ /*@Resource(name = "infulxZilaishuiDbUtil") private InfulxZilaishuiDbUtil infulxZilaishuiDbUtil; //TODO 启动后5秒初始化所有配置参数 @PostConstruct public void initZilaishuiApplication(){ new Timer().schedule(new TimerTask() { @Override public void run() { try { infulxZilaishuiDbUtil.initInfluxDataBase(); KprZilaishuiWaterBizFun.infulxZilaishuiDbUtil= infulxZilaishuiDbUtil; }catch(Exception ex){ log.error("自来水启动时初始化配置参数失败:"+ex.getLocalizedMessage()); } } },5000); } @PostConstruct public void initZilaishuiHisData(){ //TODO 启动时同步当前月一号到当前时间的所有历史数据 new Timer().schedule(new TimerTask() { @Override public void run() { try { KprZilaishuiWaterBizFun.initHistoryDb(LocalDate.now().withDayOfMonth(1).atStartOfDay()); }catch(Exception ex){ } } },7000); new Timer().schedule(new TimerTask() { @Override public void run() { try { }catch(Exception ex){ } } },8000); } //TODO 每小时的第 0, 5, 10, 15, ..., 55 分钟执行一次 @Scheduled(cron = "0 0/5 * * * ?") public void executeZilaishuiTask() { KprZilaishuiWaterBizFun.initHistoryDb(LocalDateTime.now() .withMinute(0) .withSecond(0) .withNano(0)); } //TODO 每天凌晨1点执行前一天的 @Scheduled(cron = "0 0 1 * * ?") public void executeZilaishuiHistoryTask() { //TODO 执行前一天的数据到当前 KprZilaishuiWaterBizFun.initHistoryDb(LocalDate.now() .minusDays(1) .atStartOfDay()); } //TODO 市自来水水位预测相关 @PostConstruct public void initWaterCollecationReacordAll(){ new Timer().schedule(new TimerTask() { @Override public void run() { LocalDateTime firstDayOfLastMonth = LocalDateTime.now() .minusMonths(1) .with(TemporalAdjusters.firstDayOfMonth()) .withHour(0) .withMinute(0) .withSecond(0) .withNano(0);//上个月0点 String formattedDate = firstDayOfLastMonth.format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss")); KprZilaishuiLevelBizFun.initWaterLevelReacordAll(formattedDate); } },5000); } //TODO 每小时的10分执行原始小时液位数据计算 @Scheduled(cron = "0 10 * * * *") public void initHourWaterCollecationReacordAll(){ new Timer().schedule(new TimerTask() { @Override public void run() { String formattedDate = LocalDate.now().atStartOfDay().format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss")); KprZilaishuiLevelBizFun.initWaterLevelReacordAll(formattedDate); } },5000); } //TODO 每小时的10分执行原始小时液位数据计算 @Scheduled(cron = "0 * * * * ?") public void initYuceLevel(){ new Timer().schedule(new TimerTask() { @Override public void run() { KprZilaishuiLevelBizFun.insertDailyData(); KprZilaishuiLevelBizFun.insertForecastData(); } },5000); } //TODO 市自来水泵数据采集 @PostConstruct public void initPumpRecordAll(){ new Timer().schedule(new TimerTask() { @Override public void run() { //当前时间到去年对应月份1号0点开始 LocalDateTime firstDayOfLastMonth = LocalDateTime.now() .minusYears(1) .with(TemporalAdjusters.firstDayOfMonth()) .withHour(0) .withMinute(0) .withSecond(0) .withNano(0);//上个月0点 String formattedDate = firstDayOfLastMonth.format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss")); KprZilaishuiPumpBizFun.initWaterPumpReacordAll(formattedDate); } },5000); } //TODO 每小时的10分执行原始小时泵数据计算 @Scheduled(cron = "0 10 * * * *") public void checkPumpRecordAll(){ new Timer().schedule(new TimerTask() { @Override public void run() { //当前时间到今天的0点开始 LocalDateTime firstDayOfLastMonth = LocalDate.now().atStartOfDay();//上个月0点 String formattedDate = firstDayOfLastMonth.format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss")); KprZilaishuiPumpBizFun.initWaterPumpReacordAll(formattedDate); } },5000); }*/ /** * TODO 汤阴业务相关 */ @Resource(name = "infulxTyDbUtil") private InfulxTyDbUtil infulxTyDbUtil; //TODO 启动后5秒初始化所有配置参数 @PostConstruct public void initTangyinApplication(){ new Timer().schedule(new TimerTask() { @Override public void run() { try { infulxTyDbUtil.initInfluxDataBase(); KprTangyinWaterBizFun.infulxTyDbUtil = infulxTyDbUtil; }catch(Exception ex){ log.error("汤阴启动时初始化配置参数失败:"+ex.getLocalizedMessage()); } } },5000); } @PostConstruct public void oneYearInit(){ new Timer().schedule(new TimerTask() { @Override public void run() { KprTangyinWaterBizFun.selectOneYear(); } },7000); } }