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

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 前端技术 > javascript >内容正文

javascript

Spring的@Scheduled注解实现定时任务

發布時間:2025/3/12 javascript 25 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Spring的@Scheduled注解实现定时任务 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

Spring的@Scheduled注解實現定時任務

【簡介篇】

項目經常會用到定時任務,實現定時任務的方式有很多種。在Spring框架中,實現定時任務很簡單,常用的實現方式是使用注解@Scheduled。

@Scheduled 常用來實現簡單的定時任務。例如凌晨1點跑批,每10秒查詢支付狀態等

【實戰篇】

SpringBoot項目

1、配置

在spring boot的啟動類上加@EnableScheduling注解,允許支持@Scheduled:

@SpringBootApplication @EnableScheduling public class Application {public static void main(String[] args) throws Exception {SpringApplication.run(Application.class);} }

2、任務類

@Component public class ScheduleTask {// 每隔5秒執行一次@Scheduled(cron = "0/5 * * * * ?")public void printSay() {System.out.println("每隔5秒執行一次:" + new Date());} }

3、結果

Spring項目

1、配置

在spring.xml(或applicationContext.xml,以自己的配置文件名為準)中添加配置

<!-- 1、在 xmlns中加入 --> xmlns:task="http://www.springframework.org/schema/task"<!-- 2、 在xsi:schemaLocation中加入 -->http://www.springframework.org/schema/taskhttp://www.springframework.org/schema/task/spring-task-3.0.xsd"<!3、 配置spring掃描注解的路徑 --> <context:component-scan base-package="com.it.mytask" /><!-- 4、 定時任務掃描配置 --> <!-- 4.1、 方式一: --> <task:executor id="executor" pool-size="5" /> <task:scheduler id="scheduler" pool-size="10" /> <task:annotation-driven executor="executor" scheduler="scheduler" /><!-- 4.2、 方式二:--> <task:annotation-driven scheduler="scheduler" mode="proxy"/> <task:scheduler id="scheduler" pool-size="10"/>

<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:aop="http://www.springframework.org/schema/aop"xmlns:context="http://www.springframework.org/schema/context"xmlns:tx="http://www.springframework.org/schema/tx"xmlns:task="http://www.springframework.org/schema/task"xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsdhttp://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-3.0.xsdhttp://www.springframework.org/schema/context http://www.springframework.org/schema/jdbc/spring-jdbc-3.0.xsdhttp://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-3.0.xsdhttp://www.springframework.org/schema/task http://www.springframework.org/schema/task/spring-task-3.0.xsd"default-lazy-init="false"><context:annotation-config /><!— 配置spring掃描注解的路徑 --><context:component-scan base-package="com.it.mytask" /><!-- 定時任務掃描配置 --><!— 開啟這個配置,spring才能識別@Scheduled注解 --><task:annotation-driven scheduler="scheduler" mode="proxy"/><task:scheduler id="scheduler" pool-size="10"/></beans>

2、任務類同上

3、結果同上

【原理篇】

@Scheduled源碼

@Target({ElementType.METHOD, ElementType.ANNOTATION_TYPE}) @Retention(RetentionPolicy.RUNTIME) @Documented @Repeatable(Schedules.class) public @interface Scheduled {String cron() default "";String zone() default "";long fixedDelay() default -1L;String fixedDelayString() default "";long fixedRate() default -1L;String fixedRateString() default "";long initialDelay() default -1L;String initialDelayString() default ""; }

案例

package com.task;import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.scheduling.annotation.Scheduled; import org.springframework.stereotype.Component;@Component public class ScheduledTask {private Logger logger= LoggerFactory.getLogger(ScheduledTask.class);// fixedRate = 5000表示每隔5秒,Spring scheduling會調用一次該方法,不論該方法的執行時間是多少@Scheduled(fixedRate = 5000)public void task() {logger.info("每隔5秒執行一次");}// fixedDelay = 5000表示當方法執行完畢5秒后,Spring scheduling會再次調用該方法@Scheduled(fixedDelay = 5000)public void taskAfter() {logger.info("當方法執行完畢5秒后執行");}// cron = "*/5 * * * * * *" 通用的定時任務表達式,表示每隔5秒執行一次@Scheduled(cron = "*/5 * * * * *")public void taskCron() {logger.info("每隔5秒執行一次");} }

cron 表達式

1、cron一共有7位,但是最后一位是年(1970-2099),可以留空,所以我們可以寫6位,按順序依次為

  • 秒(0~59)
  • 分鐘(0~59)
  • 小時(0~23)
  • 天(月)(1~31,但是你需要考慮你月的天數)
  • 月(1~12)
  • 星期(1~7 1=SUN,MON,TUE,WED,THU,FRI,SAT)

2、cron的一些特殊符號

  • (*)星號:可以理解為每的意思,每秒,每分,每天,每月,每年…
  • (?)問號:問號只能出現在日期和星期這兩個位置,表示這個位置的值不確定,每天3點執行,所以第六位星期的位置,我們是不需要關注的,就是不確定的值。同時:日期和星期是兩個相互排斥的元素,通過問號來表明不指定值。比如,1月10日,比如是星期1,如果在星期的位置是另指定星期二,就前后沖突矛盾了。
  • (-)減號:表達一個范圍,如在小時字段中使用“10-12”,則表示從10到12點,即10,11,12
  • (,)逗號:表達一個列表值,如在星期字段中使用“1,2,4”,則表示星期一,星期二,星期四
  • (/)斜杠:如:x/y,x是開始值,y是步長,比如在第一位(秒) 0/15就是,從0秒開始,每15秒,最后就是0,15,30,45,60 另:*/y,等同于0/y

eg.下面列舉幾個例子供大家來驗證:

0 0 3 * * ? 每天3點執行 0 5 3 * * ? 每天35分執行 0 5 3 ? * * 每天35分執行,與上面作用相同 0 5/10 3 * * ? 每天3點的 5分,15分,25分,35分,45分,55分這幾個時間點執行 0 10 3 ? * 1 每周星期天,310分 執行,注:1表示星期天 0 10 3 ? * 1#3 每個月的第三個星期,星期天 執行,#號只能出現在星期的位置

常用示例:
格式: [秒] [分] [小時] [日] [月] [周] [年]

0 0 12 * * ? 每天12點觸發 0 15 10 ? * * 每天1015分觸發 0 15 10 * * ? 每天1015分觸發 0 15 10 * * ? * 每天1015分觸發 0 15 10 * * ? 2005 2005年每天1015分觸發 0 * 14 * * ? 每天下午的 2點到259分每分觸發 0 0/5 14 * * ? 每天下午的 2點到259(整點開始,每隔5分觸發) 0 0/5 14,18 * * ? 每天下午的 18點到1859(整點開始,每隔5分觸發) 0 0-5 14 * * ? 每天下午的 2點到205分每分觸發 0 10,44 14 ? 3 WED 3月分每周三下午的 210分和244分觸發 0 15 10 ? * MON-FRI 從周一到周五每天上午的1015分觸發 0 15 10 15 * ? 每月15號上午1015分觸發 0 15 10 L * ? 每月最后一天的1015分觸發 0 15 10 ? * 6L 每月最后一周的星期五的1015分觸發 0 15 10 ? * 6L 2002-20052002年到2005年每月最后一周的星期五的1015分觸發 0 15 10 ? * 6#3 每月的第三周的星期五開始觸發 0 0 12 1/5 * ? 每月的第一個中午開始每隔5天觸發一次 0 11 11 11 11 ? 每年的11111111分觸發(光棍節)

總結

以上是生活随笔為你收集整理的Spring的@Scheduled注解实现定时任务的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。