色综合图-色综合图片-色综合图片二区150p-色综合图区-玖玖国产精品视频-玖玖香蕉视频

您的位置:首頁技術文章
文章詳情頁

Spring內置定時任務調度@Scheduled使用詳解

瀏覽:78日期:2023-07-29 15:56:59

Spring提供了@Scheduled注解用于定時任務。

一、@Scheduled的基本使用

啟用調度支持:@EnableScheduling

可以將@Scheduled注釋與觸發器元數據一起添加到方法中。例如,以下方法每隔5秒調用一次,并具有固定的延遲,這意味著周期是從前面每次調用的完成時間開始計算的

@Scheduled(fixedDelay=5000)public void doSomething() {// something that should execute periodically}

如果需要固定速率執行,可以更改批注中指定的屬性名。以下方法每5秒調用一次(在每次調用的連續開始時間之間計算)

@Scheduled(fixedRate=5000)public void doSomething() {// something that should execute periodically}

對于固定延遲和固定速率任務,可以通過指示在首次執行方法之前要等待的毫秒數來指定初始延遲

@Scheduled(initialDelay=1000, fixedRate=5000)public void doSomething() {// something that should execute periodically}

如果簡單的周期性調度不夠表達,可以提供cron表達式。例如,以下命令僅在工作日執行:

@Scheduled(cron='*/5 * * * * MON-FRI')public void doSomething() {// something that should execute on weekdays only}

實現SchedulingConfigurer接口,重寫configureTasks方法:

@Schedule注解的一個缺點就是其定時時間不能動態更改,它適用于具有固定任務周期的任務,若要修改任務執行周期,只能走“停服務→修改任務執行周期→重啟服務”這條路。而基于 SchedulingConfigurer 接口方式可以做到。SchedulingConfigurer 接口可以實現在@Configuration等注解類上。

ScheduledTaskRegistrar類包括以下幾個重要方法:

void addTriggerTask(Runnable task, Trigger trigger) void addTriggerTask(TriggerTask task)void addCronTask(Runnable task, String expression)void addCronTask(CronTask task)void addFixedRateTask(Runnable task, long interval)void addFixedRateTask(IntervalTask task)void addFixedDelayTask(Runnable task, long delay)void addFixedDelayTask(IntervalTask task)

具體實現參考如下:

@Componentpublic class TestTask implements SchedulingConfigurer { @Override public void configureTasks(ScheduledTaskRegistrar taskRegistrar) { taskRegistrar.addTriggerTask(new Runnable() { @Override public void run() {// 定時任務要執行的內容System.out.println('【開始執行定時任務。。。】'); } }, new Trigger() { @Override public Date nextExecutionTime(TriggerContext triggerContext) {// 定時任務觸發,可修改定時任務的執行周期String cron = '0 0/5 * * * ?'; //可以將表達式配置在數據庫中CronTrigger trigger = new CronTrigger(cron);Date nextExecDate = trigger.nextExecutionTime(triggerContext);return nextExecDate; } }); }}

提示:如果在數據庫修改時格式出現錯誤,則定時任務會停止,即使重新修改正確;此時只能重新啟動項目才能恢復。

二、使用@Scheduled注意事項

spring的注解@Scheduled 需要寫在實現方法上; 定時器的任務方法不能有返回值(如果有返回值,spring初始化的時候會告訴你有個錯誤、需要設定一個proxytargetclass的某個值為true),不能指向任何的參數; 如果該方法需要與應用程序上下文的其他對象進行交互,通常是通過依賴注入來實現; 實現類上要有組件的注解@Component。

三、使用@Scheduled常見問題

單線程任務丟失,轉為異步線程池

默認的 ConcurrentTaskScheduler 計劃執行器采用Executors.newSingleThreadScheduledExecutor() 實現單線程的執行器。因此,對同一個調度任務的執行總是同一個線程。如果任務的執行時間超過該任務的下一次執行時間,則會出現任務丟失,跳過該段時間的任務。上述問題有以下解決辦法:

采用異步的方式執行調度任務,配置 Spring 的 @EnableAsync,在執行定時任務的方法上標注 @Async配置任務執行池,線程池大小 n 的數量為 單個任務執行所需時間 / 任務執行的間隔時間。如下:

//每30秒執行一次@Async('taskExecutor')@Scheduled(fixedRate = 1000 * 3)public void reportCurrentTime(){ System.out.println ('線程' + Thread.currentThread().getName() + '開始執行定時任務===&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&7&&&====》' + new SimpleDateFormat('yyyy-MM-dd HH:mm:ss').format(new Date())); long start = System.currentTimeMillis();}

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持好吧啦網。

標簽: Spring
相關文章:
主站蜘蛛池模板: 特级做人爱c级特级aav毛片 | 亚洲欧美日韩高清综合678 | 欧美aaa| 国内美女福利视频在线观看网站 | 日韩精品中文字幕在线 | 久久综合久久综合九色 | 国产一级做a爰片久久毛片99 | 日本欧美久久久久免费播放网 | 中文字幕精品视频在线 | 精品国产成人综合久久小说 | 欧美成人免费夜夜黄啪啪 | 996久久国产精品线观看 | 久草在线免费看 | 在线中文字幕视频 | 亚洲国产高清视频 | 亚洲精品 欧美 | jiucao在线观看精品 | 欧美一级α片毛片免费观看 | 成人黄网大全在线观看 | 国产伦精品一区二区三区 | 成年性午夜免费视频网站不卡 | 99精品在线免费 | 国产手机在线视频放线视频 | 欧美午夜a级精美理论片 | 日韩欧美一区二区三区不卡视频 | 97精品国产高清在线看入口 | 欧美一级淫片免费观看 | 亚洲最新视频在线观看 | 中国国语毛片免费观看视频 | 美女视频黄的免费视频网页 | 九九在线免费视频 | 国产一级精品毛片 | 中文字幕日本一区波多野不卡 | 欧美一级毛片日本 | 白嫩美女一级毛片免费看 | 999成人国产精品 | 99视频在线观看免费视频 | 欧美精品成人 | 欧美第一精品 | 男人的天堂免费网站 | 久久成人免费大片 |