日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区

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

淺談springboot項目中定時任務如何優雅退出

瀏覽:26日期:2023-04-19 15:38:39

在一個springboot項目中需要跑定時任務處理批數據時,突然有個Kill命令或者一個Ctrl+C的命令,此時我們需要當批數據處理完畢后才允許定時任務關閉,也就是當定時任務結束時才允許Kill命令生效。

啟動類

啟動類上我們獲取到相應的上下文,捕捉相應命令。在這里插入代碼片

@SpringBootApplication/**指定mapper對應包的路徑*/@MapperScan('com.youlanw.kz.dao')/**開啟計劃任務*/@EnableScheduling/**開啟異常重試機制*/@EnableRetrypublic class YlkzTaskApplication { public static ConfigurableApplicationContext context; public static void main(String[] args) { context = SpringApplication.run(YlkzTaskApplication.class, args); /** * 捕捉命令實現優雅退出 */ MySignalHandler.install('TERM'); //捕捉kill命令 MySignalHandler.install('INT'); //捕捉ctrl+c命令 }}

優雅退出配置類

通過install方法捕捉到相應的命令,

通過signalAction方法進行總開發的控制。

import org.slf4j.LoggerFactory;import sun.misc.Signal;import sun.misc.SignalHandler;/** * @description: 定時任務控制類(實現優雅退出) * @method: * @author: mamengmeng * @date: 10:51 2018/8/13 */public class MySignalHandler implements SignalHandler { private final static org.slf4j.Logger logger = LoggerFactory.getLogger(MySignalHandler.class); private SignalHandler oldHandler; /** * 定時任務總開關-狀態:true:打開 false:關閉 */ public static boolean base_flag = true; @Override public void handle(Signal signal) { signalAction(signal); } public static SignalHandler install(String signalName) { Signal diagSignal = new Signal(signalName); MySignalHandler instance = new MySignalHandler(); instance.oldHandler = Signal.handle(diagSignal, instance); return instance; } public void signalAction(Signal signal) { try { //關閉總開關 this.base_flag = false; logger.info('n執行優雅退出操作n等待運行中任務執行完畢…………'); Thread.sleep(3000); StringBuffer stringBuffer = new StringBuffer('a'); //此處為相關的業務代碼,只要還有一個定時任務在執行,那么就等待線程任務執行完畢。 while (BaseApplyTask.apply_flag || BaseResumeTask.resume_flag || CorpDemandTask.demand_flag || RecommendResumeTask.resume_flag || BaseCodeTask.code_flag || RecommendoneTask.resume_flag ||ResumeByZcbTask.zpbresume_flag) {//等待線程任務執行完畢stringBuffer.append(''); } //獲取到的上下文對象關閉相應的程序。 YlkzTaskApplication.context.close(); logger.info('n================n程序已安全退出!n================'); oldHandler.handle(signal); } catch (Exception e) { logger.error('handle|Signal handler' + 'failed, reason ' + e.getMessage()); e.printStackTrace(); } }}

舉例說明

我們在定時任務中添加一個總開關,當總開關是關著時是不允許定時任務執行的,

@Componentpublic class BaseCodeTask { private final static Logger logger = LoggerFactory.getLogger(BaseCodeTask.class); @Autowired private ResumeService resumeService; public static boolean code_flag = true; //簡歷任務執行狀態 true:執行中 false:執行完畢 private static final Integer LIMIT = 500; private final static long time = 60 * 1000; //一分鐘 /** * @param * @description: 同步簡歷信息(定時任務) * 任務執行間隔時間:6秒 * 待同步數據為空,則5分鐘后執行下一次 * @method: sendResume * @author: zhengmingjie * @date: 16:17 2018/8/3 * @return: void */ @Scheduled(initialDelay = 1000, fixedDelay = time / 10) @Async public void sendResume() throws Exception { List<Resume> list = null; try { //總開關狀態:true:打開 false:關閉 if (!MySignalHandler.base_flag)return; this.code_flag = true; logger.info('n======定時任務:初始化基本數據======n開始執行n'); //以下是業務代碼。相關的定時任務批處理 resumeService.initializationMap(); resumeService.setCodeDictionary(); resumeService.setCityInfo(); resumeService.setCodePostInfo(); logger.info('n======定時任務:初始化基本數據======n結束n'); } catch (Exception e) { e.printStackTrace(); } finally { this.code_flag = false; } }}

定時任務優雅退出的使用可以有效的防止批處理任務的中斷,小伙伴們可以嘗試添加哦。。。。

補充知識:springboot自帶定時器實現定時任務的開啟關閉以及動態修改定時規則

最近項目中遇到了需要自動定時導出的需求,用戶可以從頁面修改導出的時間規則,可以啟用和停用定時任務。

經過了解,項目中目前實現定時任務,一般有三種選擇,一是用Java自帶的timer類。稍微看了一下,可以實現大部分的指定頻率的任務的調度(timer.schedule()),也可以實現關閉和開啟(timer.cancle)。但是用其來實現某天的某個時間或者某月的某一天調度任務有點不方便。

二是采用Quartz 調度器實現。這是一個功能很強大的開源的專門用于定時任務調度的框架,也很好的和springboot整合,缺點:配置復雜,需要花費一定的時間去了解和研究。(本人懶,因此沒有選擇這個,但是這個功能地區強大,有時間研究)

三是spring3.0以后自帶的scheduletask任務調度,可以實現quartz的大部分功能,不需要額外引用jar,也不需要另外配置。而且支持注解和配置文件兩種。

因此最后選擇直接用spring自帶的task 實現。

基本用法很簡單,通過在方法上加注解@schedule(也可以通過xml文件配置的方式),注解里有 cron ,fixedDelay ,fixedRate ,initialDelay 等等參數,可以完成指定時間,平率執行此方法。這里不詳細介紹。

直接介紹,通過頁面動態修改cron參數,修改定時規則的思路。

1 實現接口SchedulingConfigurer,這個接口只有一個方法,配置定時任務。重寫此方法,添加新的任務實現runable和新的觸發 實現trigger 。

2 在新的觸發里,把修改的cron寫入新的觸發

3 寫UI 方法,接收前端修改的定時參數。

代碼如下:

package com.fiberhome.ms.cus.cashform.ui;import java.util.Date;import org.springframework.beans.factory.annotation.Autowired;import org.springframework.scheduling.Trigger;import org.springframework.scheduling.TriggerContext;import org.springframework.scheduling.annotation.SchedulingConfigurer;import org.springframework.scheduling.config.ScheduledTaskRegistrar;import org.springframework.scheduling.support.CronTrigger;import org.springframework.stereotype.Component;@Componentpublic class DynamicScheduledTask implements SchedulingConfigurer {@Autowiredprivate ScheduleExport scheduleExport;// private static String DEFAULT_CRON = '0/10 * * * * ?';private String cron = '';public String getCron() {return cron;}public void setCron(String cron) {this.cron = cron;}@Overridepublic void configureTasks(ScheduledTaskRegistrar taskRegistrar) {// TODO Auto-generated method stubtaskRegistrar.addTriggerTask(new Runnable() {@Overridepublic void run() {// TODO Auto-generated method stubtry {scheduleExport.scheduleTaskExport();//異步定時生成文件System.out.println('Msg:定時生成文件成功');} catch (Exception e) {// TODO: handle exceptione.printStackTrace();System.out.println('Error:定時生成文件錯誤');}}}, new Trigger() {@Overridepublic Date nextExecutionTime(TriggerContext triggerContext) {// TODO Auto-generated method stubif (''.equals(cron)|| cron == null)return null;CronTrigger trigger = new CronTrigger(cron);// 定時任務觸發,可修改定時任務的執行周期Date nextExecDate = trigger.nextExecutionTime(triggerContext);return nextExecDate;}});System.out.println('can?');}}

這個方法可以實現 根據頁面設置動態修改定時器的cron參數,不用重啟服務。但是運行之后發現了一個缺陷,即必須在修改完之后,只有再一次到達定時任務的時間,才會調用新的觸發時間, 這就導致,頁面設置的時間并不能即時生效,這在項目中是不符合用戶的要求,于是為了解決這個bug,換了另外一種解決方法。

思路:(了解ThreadPoolTaskScheduler這個類,TaskScheduler接口的默認實現類,多線程定時任務執行。可以設置執行線程池數(默認一個線程))

1、ThreadPoolTaskScheduler 實現TaskScheduler,可以通過方法 schedule(java.lang.Runnable task, Trigger trigger),添加定時任務和觸發器。返回java.util.concurrent.ScheduledFuture<?>,future可以控制任務的開關等。

2、前端修改定時參數,在set方法中修改ThreadPoolTaskScheduler 的觸發器。

代碼如下:

package com.fiberhome.ms.cus.cashform.ui.util;import java.util.Date;import java.util.concurrent.ScheduledFuture;import org.springframework.beans.factory.annotation.Autowired;import org.springframework.scheduling.Trigger;import org.springframework.scheduling.TriggerContext;import org.springframework.scheduling.concurrent.ThreadPoolTaskScheduler;import org.springframework.scheduling.support.CronTrigger;import org.springframework.stereotype.Component;import com.fiberhome.ms.cus.cashform.ui.ScheduleExport;@Componentpublic class DynamicScheduleTaskSecond {@Autowiredprivate ThreadPoolTaskScheduler threadPoolTaskScheduler;@Autowiredprivate ScheduleExport scheduleExport;private ScheduledFuture<?> future;private String cron = '';public String getCron() {return cron;}public void setCron(String cron) {this.cron = cron;stopCron();future = threadPoolTaskScheduler.schedule(new Runnable() {@Overridepublic void run() {// TODO Auto-generated method stubtry {scheduleExport.scheduleTaskExport();// 異步定時生成文件System.out.println('Msg:定時生成文件成功');} catch (Exception e) {// TODO: handle exceptione.printStackTrace();System.out.println('Error:定時生成文件錯誤');}}}, new Trigger() {@Overridepublic Date nextExecutionTime(TriggerContext triggerContext) {// TODO Auto-generated method stubif (''.equals(cron) || cron == null)return null;CronTrigger trigger = new CronTrigger(cron);// 定時任務觸發,可修改定時任務的執行周期Date nextExecDate = trigger.nextExecutionTime(triggerContext);return nextExecDate;}});}public void stopCron() {if (future != null) {future.cancel(true);//取消任務調度}}}

驗證可行,作個記錄,如果有認為可以調整的地方,歡迎討論!

以上這篇淺談springboot項目中定時任務如何優雅退出就是小編分享給大家的全部內容了,希望能給大家一個參考,也希望大家多多支持好吧啦網。

標簽: Spring
相關文章:
日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区
88xx成人免费观看视频库| 99视频一区| 欧美久久久网站| 久久在线91| 亚洲欧美网站| 日韩在线第七页| 中文在线资源| 国产精品欧美三级在线观看 | 国产日韩欧美中文在线| 日本成人在线视频网站| 日韩精品视频在线看| 日韩精品一区二区三区中文在线| 中文字幕av一区二区三区人| 亚洲香蕉久久| 日本aⅴ精品一区二区三区| 日本国产亚洲| 国产精品一区二区精品| 久久精品五月| 精品国产第一福利网站| 日韩三区免费| 国产一区导航| 日韩av在线免费观看不卡| 国产精品日韩精品在线播放| 国内精品麻豆美女在线播放视频| 国产精品精品国产一区二区| 夜鲁夜鲁夜鲁视频在线播放| 在线日韩中文| 亚洲精品成人一区| 国产欧美日韩一级| 成人片免费看| 老色鬼久久亚洲一区二区| 日本成人在线不卡视频| 久久av中文| 色在线视频观看| 亚洲电影在线一区二区三区| 中文字幕亚洲在线观看| 美女久久久久久| 日韩国产一区| 在线亚洲激情| 国产欧美一级| 一区二区三区视频免费观看| 久热re这里精品视频在线6| 欧美日韩一区二区三区四区在线观看 | 日韩毛片在线| 一区在线视频观看| 日韩 欧美一区二区三区| 免费一区二区三区在线视频| 成人va天堂| 久久国产精品久久久久久电车 | 国产66精品| 亚洲一区二区毛片| 日韩高清一区二区| 桃色一区二区| 日本一区二区中文字幕| 中文av在线全新| 亚洲精品乱码日韩| 国产欧洲在线| 日本亚洲不卡| 99久久激情| 日韩二区三区四区| 91精品婷婷色在线观看| 日韩有码av| 久久高清精品| 国产精品久久国产愉拍| 久久亚洲成人| 欧美日韩一区二区三区不卡视频 | 日韩av中文字幕一区二区| 国产在线|日韩| 国产日韩三级| 亚洲综合欧美| 91欧美在线| 日本aⅴ精品一区二区三区 | 麻豆91在线播放| 午夜在线观看免费一区| 精品国产一区二| 亚洲有吗中文字幕| 亚洲天堂1区| 久久99青青| 日韩一区二区三区精品| 亚洲精品一二三区区别| 国产成人精品999在线观看| 蜜桃一区二区三区在线| 日韩电影二区| 久久不卡日韩美女| 亚洲综合五月| 蜜桃国内精品久久久久软件9| 久久精品色播| 日韩va欧美va亚洲va久久| 9国产精品视频| 日韩精品免费一区二区三区| 国产激情一区| 日韩av黄色在线| 蜜桃视频第一区免费观看| 亚洲国产专区校园欧美| 久久午夜影院| 国产精品一区二区99| 一区二区国产在线| 国产免费成人| 欧美在线亚洲综合一区| 日韩中文在线电影| 久久精品欧洲| 国产精品最新自拍| 亚洲午夜免费| 久久亚洲图片| 亚洲欧美日韩国产一区| 欧洲激情综合| 成人免费电影网址| 捆绑调教日本一区二区三区| 鲁大师精品99久久久| 日韩国产在线观看一区| 老鸭窝毛片一区二区三区| 久久久久午夜电影| 亚洲精品一级二级| 国产麻豆久久| 亚洲午夜av| 亚洲欧美伊人| 国产精品7m凸凹视频分类| 欧洲亚洲一区二区三区| 91嫩草亚洲精品| 在线看片福利| 97精品中文字幕| 国产精品99久久精品| 乱一区二区av| 精品美女视频 | 电影天堂国产精品| 亚洲va中文在线播放免费| 欧美久久天堂| 色婷婷精品视频| 国产综合激情| 午夜欧美理论片| 亚洲激情久久| 日韩中文欧美在线| 中文字幕成人| 91亚洲无吗| 国产精品传媒麻豆hd| 久久97久久97精品免视看秋霞| 精品欧美视频| 麻豆精品蜜桃| 妖精视频成人观看www| 日韩中文字幕亚洲一区二区va在线| 日韩午夜av在线| 免费日韩一区二区| 日韩精品高清不卡| 国产精品麻豆成人av电影艾秋 | 国产欧美一区二区三区精品酒店| 蜜臀国产一区| 激情婷婷欧美| 日韩中文字幕1| 国产欧美91| 成人在线视频区| 99精品在线观看| 免费人成在线不卡| 日韩国产成人精品| 国精品产品一区| 91精品推荐| 亚洲一区二区三区无吗| 国产探花一区| 麻豆视频在线看| 欧美在线综合| 国产图片一区| 亚洲成人不卡| 中文字幕日本一区二区| 国产欧美大片| 91看片一区| 日韩精品一级二级 | 五月激激激综合网色播| 欧美激情三区| 欧洲av一区二区| 夜夜嗨av一区二区三区网站四季av| 亚洲精品免费观看| 久久久久九九精品影院| 久久国产电影| 青草综合视频| 999精品一区| 日本一不卡视频| 国产精品黑丝在线播放| 国产精品88久久久久久| 欧美日本一区| 久久精品亚洲欧美日韩精品中文字幕| 热久久免费视频| 欧美国产不卡| 尤物在线精品| 麻豆成人av在线| 99国产精品私拍| 老司机精品在线| 亚洲综合日本| 国产va在线视频| 日韩欧美中文字幕一区二区三区| 久久久久久网| 亚洲视频电影在线| 国产精品原创| 日韩欧乱色一区二区三区在线| 日本不良网站在线观看| 亚洲三级国产| 美女av在线免费看| 日韩久久一区| 欧美高清不卡| 精品免费在线| 综合视频一区| 久久久一二三|