package io.github.pnoker.gateway.comtool; import com.alibaba.fastjson.JSONArray; import com.alibaba.fastjson.JSONObject; import io.github.pnoker.gateway.bizmgr.KprDangyangWaterBizFun; import io.github.pnoker.gateway.dbdao.DBMgrProxy; import io.github.pnoker.gateway.utils.InfulxDbUtil; 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.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 { 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); } }