日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

        歡迎訪問(wèn) 生活随笔!

        生活随笔

        當(dāng)前位置: 首頁(yè) > 编程资源 > 编程问答 >内容正文

        编程问答

        springboot定时任务处理

        發(fā)布時(shí)間:2025/3/17 编程问答 14 豆豆
        生活随笔 收集整理的這篇文章主要介紹了 springboot定时任务处理 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

        定時(shí)任務(wù)是一種很常見(jiàn)的應(yīng)用場(chǎng)景,springboot中的定時(shí)任務(wù)完全用的spring的那一套,用起來(lái)比較簡(jiǎn)單,需要注意的是線程池配置的那一塊

        使用 @EnableScheduling 注解就可以開(kāi)啟定時(shí)任務(wù)

        @Target(ElementType.TYPE) @Retention(RetentionPolicy.RUNTIME) @Import(SchedulingConfiguration.class) @Documented public @interface EnableScheduling {}

        這個(gè)注解引用了 SchedulingConfiguration.class 類

        @Configuration @Role(BeanDefinition.ROLE_INFRASTRUCTURE) public class SchedulingConfiguration {@Bean(name = TaskManagementConfigUtils.SCHEDULED_ANNOTATION_PROCESSOR_BEAN_NAME)@Role(BeanDefinition.ROLE_INFRASTRUCTURE)public ScheduledAnnotationBeanPostProcessor scheduledAnnotationProcessor() {return new ScheduledAnnotationBeanPostProcessor();}}

        這個(gè)配置類也很簡(jiǎn)單,主要定義了 ScheduledAnnotationBeanPostProcessor 類型的ben,這個(gè)類的作用就是把標(biāo)志了?
        @Scheduled(fixedDelay = 1*1000) 注解的方法收集起來(lái),封裝成一個(gè)個(gè)定時(shí)任務(wù),再構(gòu)造用于執(zhí)行任務(wù)的線程池

        @Component public class ScheduleOneTest {private static final Logger LOGGER = LoggerFactory.getLogger(ScheduleOneTest.class);@Scheduled(fixedDelay = 1*1000)public void doWork(){LOGGER.info("任務(wù)一正在執(zhí)行");try {Thread.sleep( 5 * 60 * 1000);} catch (InterruptedException e) {e.printStackTrace();}LOGGER.info("任務(wù)一執(zhí)行結(jié)束");}

        需要注意的是,默認(rèn)情況下,spring只構(gòu)造了包含一個(gè)線程的線程池

        ScheduledTaskRegistrar類if (this.taskScheduler == null) {this.localExecutor = Executors.newSingleThreadScheduledExecutor();this.taskScheduler = new ConcurrentTaskScheduler(this.localExecutor);}

        所以如果我們有多個(gè)任務(wù)需要執(zhí)行,實(shí)際上是不能并發(fā)執(zhí)行的,因?yàn)橹挥幸粋€(gè)工作線程

        @Component public class ScheduleTwoTest {private static final Logger LOGGER = LoggerFactory.getLogger(ScheduleTwoTest.class);@Scheduled(fixedDelay = 1*1000)public void doWork(){LOGGER.info("任務(wù)二正在執(zhí)行");try {Thread.sleep( 5 * 60 * 1000);} catch (InterruptedException e) {e.printStackTrace();}LOGGER.info("任務(wù)二執(zhí)行結(jié)束");} }

        像上面這樣,兩個(gè)一樣的任務(wù),同時(shí)只能執(zhí)行一個(gè),必須等一個(gè)執(zhí)行完,另一個(gè)才會(huì)執(zhí)行,那么我們?nèi)绾螢閟pring的定時(shí)任務(wù)提供包含多個(gè)線程的線程池呢?

        @Configuration public class ScheduleConfig implements SchedulingConfigurer {@Overridepublic void configureTasks(ScheduledTaskRegistrar taskRegistrar) { // taskRegistrar.setTaskScheduler(poolTaskScheduler()); taskRegistrar.setScheduler(threadPoolTaskScheduler());}@Bean(name = "taskScheduler", destroyMethod = "shutdown")public ScheduledThreadPoolExecutor threadPoolTaskScheduler(){ // ThreadPoolTaskScheduler poolTaskScheduler = new ThreadPoolTaskScheduler(); // poolTaskScheduler.setPoolSize(Runtime.getRuntime().availableProcessors() * 5); // return poolTaskScheduler;return new ScheduledThreadPoolExecutor(Runtime.getRuntime().availableProcessors() * 5);}}

        看上面代碼,實(shí)現(xiàn) SchedulingConfigurer 接口,重寫(xiě) configureTasks 方法,上面注釋掉的代碼和沒(méi)注釋掉的功能是一樣的,需要注意的是,線程池的bean名稱需要設(shè)置為 taskScheduler

        public void setScheduler(Object scheduler) {Assert.notNull(scheduler, "Scheduler object must not be null");if (scheduler instanceof TaskScheduler) {this.taskScheduler = (TaskScheduler) scheduler;}else if (scheduler instanceof ScheduledExecutorService) {this.taskScheduler = new ConcurrentTaskScheduler(((ScheduledExecutorService) scheduler));}else {throw new IllegalArgumentException("Unsupported scheduler type: " + scheduler.getClass());}}

        這樣就可以為spring的定時(shí)任務(wù)提供指定線程個(gè)數(shù)的線程池了,至于定時(shí)任務(wù)的用法,挺簡(jiǎn)單的,請(qǐng)參考其他資料

        ?

        cron表達(dá)式詳解:? ??

        一個(gè)cron表達(dá)式有至少6個(gè)(也可能7個(gè))有空格分隔的時(shí)間元素。

        ?? ??? 按順序依次為
        ?? ?? 1? 秒(0~59)
        ?? ?? 2? 分鐘(0~59)
        ?? ?? 3 小時(shí)(0~23)
        ?? ?? 4? 天(0~31)
        ?? ?? 5 月(0~11)
        ?? ?? 6? 星期(1~7 1=SUN 或 SUN,MON,TUE,WED,THU,FRI,SAT)
        ?? ?? 7.年份(1970-2099)
        ?? ?? 其中每個(gè)元素可以是一個(gè)值(如6),一個(gè)連續(xù)區(qū)間(9-12),一個(gè)間隔時(shí)間(8-18/4)(/表示每隔4小時(shí)),一個(gè)列表(1,3,5),通配符。由于"月份中的日期"和"星期中的日期"這兩個(gè)元素互斥的,必須要對(duì)其中一個(gè)設(shè)置?.
        ?? ??? 0 0 10,14,16 * * ? 每天上午10點(diǎn),下午2點(diǎn),4點(diǎn)
        ?? ??? 0 0/30 9-17 * * ??? 朝九晚五工作時(shí)間內(nèi)每半小時(shí)
        ?? ??? 0 0 12 ? * WED 表示每個(gè)星期三中午12點(diǎn)
        ?? ??? "0 0 12 * * ?" 每天中午12點(diǎn)觸發(fā)?
        ?? ??? "0 15 10 ? * *" 每天上午10:15觸發(fā)?
        ?? ??? "0 15 10 * * ?" 每天上午10:15觸發(fā)?
        ?? ??? "0 15 10 * * ? *" 每天上午10:15觸發(fā)?
        ?? ??? "0 15 10 * * ? 2005" 2005年的每天上午10:15觸發(fā)?
        ?? ??? "0 * 14 * * ?" 在每天下午2點(diǎn)到下午2:59期間的每1分鐘觸發(fā)?
        ?? ??? "0 0/5 14 * * ?" 在每天下午2點(diǎn)到下午2:55期間的每5分鐘觸發(fā)?
        ?? ??? "0 0/5 14,18 * * ?" 在每天下午2點(diǎn)到2:55期間和下午6點(diǎn)到6:55期間的每5分鐘觸發(fā)?
        ?? ??? "0 0-5 14 * * ?" 在每天下午2點(diǎn)到下午2:05期間的每1分鐘觸發(fā)?
        ?? ??? "0 10,44 14 ? 3 WED" 每年三月的星期三的下午2:10和2:44觸發(fā)?
        ?? ??? "0 15 10 ? * MON-FRI" 周一至周五的上午10:15觸發(fā)?
        ?? ??? "0 15 10 15 * ?" 每月15日上午10:15觸發(fā)?
        ?? ??? "0 15 10 L * ?" 每月最后一日的上午10:15觸發(fā)?
        ?? ??? "0 15 10 ? * 6L" 每月的最后一個(gè)星期五上午10:15觸發(fā)?
        ?? ??? "0 15 10 ? * 6L 2002-2005" 2002年至2005年的每月的最后一個(gè)星期五上午10:15觸發(fā)?
        ?? ??? "0 15 10 ? * 6#3" 每月的第三個(gè)星期五上午10:15觸發(fā)?
        ?? ??? 有些子表達(dá)式能包含一些范圍或列表
        ?? ??? 例如:子表達(dá)式(天(星期))可以為 “MON-FRI”,“MON,WED,FRI”,“MON-WED,SAT”
        ?? ??? “*”字符代表所有可能的值
        ?? ??? “/”字符用來(lái)指定數(shù)值的增量
        ?? ??? 例如:在子表達(dá)式(分鐘)里的“0/15”表示從第0分鐘開(kāi)始,每15分鐘
        ?? ???????????? 在子表達(dá)式(分鐘)里的“3/20”表示從第3分鐘開(kāi)始,每20分鐘(它和“3,23,43”)的含義一樣
        ?? ??? “?”字符僅被用于天(月)和天(星期)兩個(gè)子表達(dá)式,表示不指定值
        ?? ??? 當(dāng)2個(gè)子表達(dá)式其中之一被指定了值以后,為了避免沖突,需要將另一個(gè)子表達(dá)式的值設(shè)為“?”
        ?? ??? “L” 字符僅被用于天(月)和天(星期)兩個(gè)子表達(dá)式,它是單詞“l(fā)ast”的縮寫(xiě)
        ?? ??? 如果在“L”前有具體的內(nèi)容,它就具有其他的含義了。例如:“6L”表示這個(gè)月的倒數(shù)第6天
        ?? ??? 注意:在使用“L”參數(shù)時(shí),不要指定列表或范圍,因?yàn)檫@會(huì)導(dǎo)致問(wèn)題
        ?? ??? W 字符代表著平日(Mon-Fri),并且僅能用于日域中。它用來(lái)指定離指定日的最近的一個(gè)平日。大部分的商業(yè)處理都是基于工作周的,所以 W 字符可能是非常重要的。
        ?? ??? 例如,日域中的 15W 意味著 "離該月15號(hào)的最近一個(gè)平日。" 假如15號(hào)是星期六,那么 trigger 會(huì)在14號(hào)(星期五)觸發(fā),因?yàn)樾瞧谒谋刃瞧谝浑x15號(hào)更近。
        ?? ??? C:代表“Calendar”的意思。它的意思是計(jì)劃所關(guān)聯(lián)的日期,如果日期沒(méi)有被關(guān)聯(lián),則相當(dāng)于日歷中所有日期。例如5C在日期字段中就相當(dāng)于日歷5日以后的第一天。1C在星期字段中相當(dāng)于星期日后的第一天。
        ?? ??? 字段?? 允許值?? 允許的特殊字符
        ?? ??? 秒 ?? ? ??? ?0-59 ?? ? ??? ?, - * /
        ?? ??? 分 ?? ? ??? ?0-59 ?? ? ??? ?, - * /
        ?? ??? 小時(shí) ?? ? ??? ?0-23 ?? ? ??? ?, - * /
        ?? ??? 日期 ?? ? ??? ?1-31 ?? ? ??? ?, - * ? / L W C
        ?? ??? 月份 ?? ? ??? ?1-12 或者 JAN-DEC ?? ? ??? ?, - * /
        ?? ??? 星期 ?? ? ??? ?1-7 或者 SUN-SAT ?? ? ??? ?, - * ? / L C #
        ?? ??? 年(可選) ?? ? ??? ?留空, 1970-2099 ?? ? ??? ?, - * /

        轉(zhuǎn)載于:https://www.cnblogs.com/zhaoyan001/p/9006409.html

        新人創(chuàng)作打卡挑戰(zhàn)賽發(fā)博客就能抽獎(jiǎng)!定制產(chǎn)品紅包拿不停!

        總結(jié)

        以上是生活随笔為你收集整理的springboot定时任务处理的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

        如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。