JAVA實現定時任務 從指定時間開始每隔 n 天執行一次, 可刪除重設

本文描述的使用 Java 自帶的?ScheduledExecutorService?來實現這個業務,直接看代碼

涉及到的參數說明:

  1. ScheduledTaskManager?類負責管理定時任務的創建、取消和重設。
  2. scheduleTask?方法用于創建定時任務。它接受任務名稱、開始時間、執行間隔和任務本身作為參數。
  3. cancelTask?方法用于取消定時任務。
  4. rescheduleTask?方法用于重設定時任務,它先取消原有任務,然后使用新的參數創建新的任務。
  5. getInitialDelay?方法計算從當前時間到開始時間的延遲時間(秒)。
import cn.hutool.core.date.DateUtil;
import lombok.extern.slf4j.Slf4j;
import java.time.Duration;
import java.time.LocalDateTime;
import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.Executors;
import java.util.concurrent.ScheduledExecutorService;
import java.util.concurrent.ScheduledFuture;
import java.util.concurrent.TimeUnit;@Slf4j
public class CustomScheduledTaskManager {private final ScheduledExecutorService scheduler = Executors.newScheduledThreadPool(1);private final Map<String, ScheduledFuture<?>> scheduledTasks = new ConcurrentHashMap<>();/*** 執行定時任務* @param taskName* @param startTime* @param intervalDays* @param task*/public void scheduleTask(String taskName, LocalDateTime startTime, int intervalDays, Runnable task){log.info("CustomScheduledTaskManager task '{}' to run at {} every {} days========>", taskName, DateUtil.format(startTime, "yyyy-MM-dd HH:mm:ss"), intervalDays);long initialDelay = getInitialDelay(startTime, intervalDays);ScheduledFuture<?> future = scheduler.scheduleAtFixedRate(task, initialDelay, intervalDays * 24 * 60 * 60, TimeUnit.SECONDS);scheduledTasks.put(taskName, future);}/*** 取消任務* @param taskName*/public void cancelTask(String taskName) {log.info("CustomScheduledTaskManager task '{}' to cannel========>");ScheduledFuture<?> task = scheduledTasks.get(taskName);if (task != null) {task.cancel(true);scheduledTasks.remove(taskName);}}/*** 重新調度任務* @param taskName* @param newStartTime* @param newIntervalDays* @param task*/public void rescheduleTask(String taskName, LocalDateTime newStartTime, int newIntervalDays, Runnable task) {cancelTask(taskName);scheduleTask(taskName, newStartTime, newIntervalDays, task);}/*** 計算延遲時間* @param startTime 任務執行時間* @return*/private long getInitialDelay(LocalDateTime startTime) {LocalDateTime now = LocalDateTime.now();long seconds = startTime.toEpochSecond(java.time.ZoneOffset.UTC) - now.toEpochSecond(java.time.ZoneOffset.UTC);return seconds > 0 ? seconds : 0;}/*** 計算延遲時間* @param startTime 任務執行時間* @param intervalDays  延遲N天* @return*/public static long getInitialDelay(LocalDateTime startTime, int intervalDays) {LocalDateTime endDateTime = LocalDateTime.now();long totalSeconds = Duration.between(startTime, endDateTime).getSeconds();if(totalSeconds < 0){return Math.abs(totalSeconds);}//long totalDays = totalSeconds / (24 * 60 * 60);//long fullNDayPeriods = totalDays / intervalDays;long remainingSeconds = totalSeconds % (intervalDays * 24 * 60 * 60);long additionalSeconds = intervalDays * 24 * 60 * 60 - remainingSeconds;return additionalSeconds;}
}

首先交給Bean管理,然后在需要的地方注入即可

    @Beanpublic CustomScheduledTaskManager customScheduledTaskManager() {return new CustomScheduledTaskManager();}@Resourceprivate CustomScheduledTaskManager customScheduledTaskManager;@PostConstructprivate void init() {log.info("定時任務初始化========>");                                               customScheduledTaskManager.scheduleTask(confConfig.getFieldKey(), confConfig.getGmtModified().toInstant().atZone(ZoneId.systemDefault()).toLocalDateTime(), Integer.valueOf(confConfig.getFieldValue()), () -> {log.info("定時任務執行========>start------>");this.noticeManageService.timingPush();log.info("定時任務執行========>end------>");});}

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/14277.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/14277.shtml
英文地址,請注明出處:http://en.pswp.cn/web/14277.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

抽煙行為檢測:從傳統巡查到智能算法

在當前人工智能和計算機視覺技術的迅猛發展下&#xff0c;基于視覺分析的抽煙行為檢測算法成為一種高效的技術手段。此類算法通常依賴于深度學習模型&#xff0c;特別是卷積神經網絡&#xff08;CNN&#xff09;&#xff0c;通過對攝像頭捕捉的視頻流進行實時分析&#xff0c;能…

在舊版 Nginx 官方 Dockerfile 上集成第三方模塊的探索

問題背景 線上生產環境用的 nginx 1.21, 然后由于新功能引入的一個問題&#xff0c;需要使用第三方模塊 ngx_http_subs_filter_module&#xff0c;目的是使用正則表達式來移除響應結果中的某些數據。 由于這個客戶的環境非常重要&#xff0c;組內的大哥們也不敢隨便升級 ngin…

網絡安全、信息安全、數據安全的定義與區別

信息安全 信息安全是指信息的保密性、完整性、可用性和真實性的保持。從定義角度來說&#xff0c;信息安全沒有嚴格標準定義&#xff0c;但從信息安全涉及的內容出發&#xff0c;信息安全確保信息存儲或傳輸中的信息&#xff0c;不被他人有意或無意的竊取與破壞。這里的“信息”…

Vue3+ts(day07:pinia)

學習源碼可以看我的個人前端學習筆記 (github.com):qdxzw/frontlearningNotes 覺得有幫助的同學&#xff0c;可以點心心支持一下哈&#xff08;筆記是根據b站上學習的尚硅谷的前端視頻【張天禹老師】&#xff0c;記錄一下學習筆記&#xff0c;用于自己復盤&#xff0c;有需要學…

ENVI光譜識別指導采礦管理者監測銅礦分布

圣地亞哥SRGIS的GIS專家Chile需要利用影像光譜信號勘察Chuquicamata的銅礦分布。 解決方案 Chuquicamata是世界上最大的斑巖銅礦分布區。SRGIS發現西部地區只有有限的礦物和貧瘠的巖石&#xff0c;但東部有銅礦分布。為了進一步測定礦藏的情況&#xff0c;他們開發出一套程序&a…

PyTorch中的形狀變換術:reshape、view與permute的區別與聯系

在PyTorch中&#xff0c;reshape、view 和 permute 都是用于改變張量&#xff08;Tensor&#xff09;形狀&#xff08;shape&#xff09;的方法&#xff0c;但它們各自的功能和用途有所不同。 view: view方法用于將張量重新整形為具有指定形狀的張量。使用view時&#xff0c;必…

NoSQL Redis配置與優化

一、關系數據庫與非關系型數據庫 1. 關系型數據庫&#xff1a; 關系型數據庫是一個結構化的數據庫&#xff0c;創建在關系模型&#xff08;二維表格模型&#xff09;基礎上&#xff0c;一般面向于記錄。 SQL 語句&#xff08;標準數據查詢語言&#xff09;就是一種基于關系型…

【Python】pandas連續變量分箱

路過了學校花店 荒野到海邊 有一種浪漫的愛 是浪費時間 徘徊到繁華世界 才發現你背影 平凡得特別 繞過了城外邊界 還是沒告別 愛錯過了太久 反而錯得完美無缺 幸福兜了一個圈 &#x1f3b5; 林宥嘉《兜圈》 import pandas as pd import numpy as np from sklearn.model_selecti…

redis核心面試題一(架構原理+RDB+AOF)

文章目錄 0. redis與mysql區別1. redis是單線程架構還是多線程架構2. redis單線程為什么這么快3. redis過期key刪除策略4. redis主從復制架構原理5. redis哨兵模式架構原理6. redis高可用集群架構原理7. redis持久化之RDB8. redis持久化之AOF9. redis持久化之混合持久化 0. red…

窮人如何翻身賺錢?不妨試試這5個冷門生意,干好了,收入相當不錯

根據統計數據&#xff0c;我國月收入超過3000元的人口已超過4億&#xff0c;這意味著仍有約10億人的月收入低于3000元。正因為如此&#xff0c;網絡上許多人都自嘲為“窮人”。 然而&#xff0c;窮人真的無法改變自己的命運嗎&#xff1f;并非如此。對于渴望賺錢的窮人來說&am…

gpt2使用ggml推理

gpt2使用ggml推理 ggml/examples/gpt-2/main-backend.cpp : #include "ggml/ggml.h" #include "ggml/ggml-alloc.h" #include "ggml/ggml-backend.h"#ifdef GGML_USE_CUDA #include "ggml-cuda.h" #endif#ifdef GGML_USE_METAL #inc…

傳統藍牙模塊BR/EDR與低功耗藍牙模塊有什么區別?

傳統藍牙模塊BR/EDR與低功耗藍牙模塊有什么區別&#xff1f;下面跟隨美迅物聯網MesoonRF從多個維度來了解。   概述&#xff1a;低功耗藍牙采用了高斯頻移鍵控&#xff08;GFSK&#xff09;。這里我們先拋開藍牙的協議&#xff0c;單純從Radio的角度看收發通信&#xff0c;Ra…

【Crypto】Url編碼

文章目錄 Url編碼解題感悟 Url編碼 Url編碼 搞定 小小flag&#xff0c;拿下&#xff01; 解題感悟 有點餓了…

day 1: 738. 單調遞增的數字

738. 單調遞增的數字 當且僅當每個相鄰位數上的數字 x 和 y 滿足 x < y 時&#xff0c;我們稱這個整數是單調遞增的。 給定一個整數 n &#xff0c;返回 小于或等于 n 的最大數字&#xff0c;且數字呈 單調遞增 。 示例1&#xff1a; 輸入&#xff1a;n 10 輸出&#xff1a…

圖數據庫助力供應鏈柔性升級

導讀 當今市場環境受短視頻等流媒體影響&#xff0c;任何風險事件在社交網絡中傳播速度極其迅速&#xff0c;留給企業的反應時間按分秒計&#xff0c;傳統供應鏈的年度計劃面對劇烈變化的市場環境已失去意義。此外&#xff0c;受近年局勢動蕩的影響&#xff0c;市場需求和供應…

APISIX-簡單使用

APISIX-簡單使用 這個工具還是很不錯的&#xff0c;可視化的配置很清晰 &#xff0c; 想用NGINX的配置模式也是可以的&#xff0c;就是要去修改配置文件了。 APISIX&#xff0c;一個很不錯的可視化工具&#xff0c;用來代替Nginx相當不錯&#xff0c;可作為Nginx的平替方案&…

【Python進階】主流電商平臺數據分析||數據采集返回商品詳情主題鏈接主圖SKU數據

Python是一種高級編程語言&#xff0c;廣泛應用于軟件開發、數據分析、人工智能、科學計算等領域。在軟件開發方面&#xff0c;Python在網站開發、網絡編程、桌面軟件開發等方面有著廣泛的應用。在數據分析和人工智能領域&#xff0c;Python的各種庫如NumPy、Pandas、Matplotli…

守護者:ThingsBoard物聯網網關在溫室環境監測中的應用

系統設計 智慧農業溫室大棚系統由傳感器及執行設備、數據傳輸網關、智慧農業溫室大棚管理平臺組成。 系統支持實時采集溫室大棚內的空氣溫濕度、土壤溫濕度、光照和二氧化碳等環境參數&#xff0c;根據農作物的生長需求自動控制溫室中電器設備的啟停&#xff0c;從而達到植物生…

中移物聯OneMO Cat.1模組推動聯網POS規模應用

在第三方支付蓬勃發展和消費模式不斷革新的時代背景下&#xff0c;新型聯網POS終端以其智能化、便捷化的特點豐富人們生活便利度。在這一變革浪潮中&#xff0c;中移物聯OneMO Cat.1模組ML307R憑借其卓越的性能和成本效益&#xff0c;成為推動聯網POS規模應用的重要力量。 性能…

DHCP 動態分配概述

DHCP 動態分配概述 DHCP&#xff08;Dynamic Host Configuration Protocol&#xff0c;動態主機配置協議&#xff09;是一種網絡協議&#xff0c;用于自動分配IP地址和其他網絡配置參數&#xff08;如子網掩碼、默認網關、DNS服務器&#xff09;給網絡中的設備。這簡化了網絡管…