本篇內容介紹了“springboot怎么通過注解、接口創建定時任務”的有關知識,在實際案例的操作過程中,不少人都會遇到這樣的困境,接下來就讓小編帶領大家學習一下如何處理這些情況吧!希望大家仔細閱讀,能夠學有所成!
springboot定時任務的創建,這里就主要說兩種方式
通過注解創建
通過springboot中提供的接口實現
在類上主要用到了@EnableScheduling注解,都在org.springframework:spring-context這個包下
就引入org.springframework:spring-context這個包就可以使用了
<dependency> <groupId>org.springframework</groupId> <artifactId>spring-context</artifactId> <version>${spring.version}</version> </dependency>
import org.springframework.scheduling.annotation.EnableScheduling; import org.springframework.scheduling.annotation.Scheduled; import org.springframework.stereotype.Component; import java.text.SimpleDateFormat; import java.util.Date; /** * @createdTime: 2020/4/7 16:00. * @version: 1.0 . */ //在類型使用@EnableScheduling來開啟定時任務 @Component @EnableScheduling public class TestTask { private static ThreadLocal<SimpleDateFormat> dateFormat = ThreadLocal.withInitial(() -> new SimpleDateFormat("yyyy-MM-dd HH:mm:ss")); //在方法上使用@Scheduled注解來創建具體的定時任務 @Scheduled(cron = "0/10 * * * * ?") private void task1() { System.err.println("執行定時任務了,執行時間為:" + dateFormat.get().format(new Date())); } }
看下執行結果:
在類上使用了@EnableScheduling來開啟定時任務,使用了@Component是為了注入到spring容器中,這里不用@Component會不會注入我倒沒有試過,有試過的小伙伴可以說一下。
在具體需要定時執行的方法上,使用 @Scheduled注解,這個注解里面的參數有很多種,我這用了cron表達式,這里介紹下這個注解的參數吧
cron
使用方式:@Scheduled(cron = "0/10 * * * * ?")
源碼定義:String cron() default "";
說明:cron表達式,就是我們日常用的cron,具體的就不貼出來了
zone
使用方式:@Scheduled(zone = "GMT+08:00")
源碼定義:String zone() default "";
說明:時區,cron表達式會基于這個時區解析,默認為空,會取應用所在服務器的時區,一般不填就可以了,和jdk中TimeZone用的是統一體系,就不具體說了
fixedDelay
使用方式:@Scheduled(fixedDelay = 1)
源碼定義:long fixedDelay() default -1;
說明:上次執行完了,相隔多長時間以后再執行,單位是毫秒
fixedDelayString
使用方式:
@Scheduled(fixedDelayString = "1")
@Scheduled(fixedDelayString = "${配置文件里面的值}")
源碼定義:String fixedDelayString() default "";
說明:和fixedDelay一樣,是string類型的可以填數,單位是毫秒,可以使用配置文件里面的值,使用方法和spring注入配置文件的使用方式一樣
fixedRate
使用方式:@Scheduled(fixedRate = 1)
源碼定義:long fixedRate() default -1;
說明:上次執行開始后,相隔多長時間以后再執行,單位是毫秒
fixedRateString
使用方式:
@Scheduled(fixedRateString = "1")
@Scheduled(fixedRateString = "${配置文件里面的值}")
源碼定義:String fixedRateString() default "";
說明:和fixedRate一樣,,是string類型的可以填數,單位是毫秒,可以使用配置文件里面的值,使用方法和spring注入配置文件的使用方式一樣
initialDelay
使用方式:@Scheduled(initialDelay = 1)
源碼定義:long initialDelay() default -1;
說明:上第一次執行后,相隔多長時間以后再執行,單位是毫秒
initialDelayString
使用方式:
@Scheduled(initialDelayString = "1")
@Scheduled(initialDelayString = "${配置文件里面的值}")
源碼定義:String initialDelayString() default "";
說明:和initialDelay一樣,,是string類型的可以填數,單位是毫秒,可以使用配置文件里面的值,使用方法和spring注入配置文件的使用方式一樣
通過接口創建定時,就會比較靈活,定時cron表達式就不用寫死在代碼的注解上了,可以通過存儲到數據庫等存儲系統中,在接口中來獲取這個配置的表達式,這樣可以實現一個簡易的任務調度平臺,通過數據庫配置就可以管理定時任務的執行
主要用的是這個接口SchedulingConfigurer,他是org.springframework.scheduling.annotation.SchedulingConfigurer這個包路徑,其實也是都在org.springframework:spring-context這個包下
就引入org.springframework:spring-context這個包就可以使用了
<dependency> <groupId>org.springframework</groupId> <artifactId>spring-context</artifactId> <version>${spring.version}</version> </dependency>
復寫configureTasks方法,這個方法通過ScheduledTaskRegistrar來添加定時任務,大致看方法,入參基本是一個線程對象,后面那個參數和注解里面一樣,主要有cron表達式,delay上次執行完了,相隔多長時間以后再執行,initial什么的就不一一贅述了
直接上代碼來一個栗子
import org.springframework.scheduling.TaskScheduler; import org.springframework.scheduling.annotation.EnableScheduling; import org.springframework.scheduling.annotation.SchedulingConfigurer; import org.springframework.scheduling.config.ScheduledTaskRegistrar; import org.springframework.scheduling.config.Task; import org.springframework.stereotype.Component; import java.text.SimpleDateFormat; import java.util.Date; /** * @createdTime: 2020/4/7 18:33. * @version: 1.0 . */ @Component @EnableScheduling public class TestTask2 implements SchedulingConfigurer { private static ThreadLocal<SimpleDateFormat> dateFormat = ThreadLocal.withInitial(() -> new SimpleDateFormat("yyyy-MM-dd HH:mm:ss")); /** * Callback allowing a {@link TaskScheduler * TaskScheduler} and specific {@link Task Task} * instances to be registered against the given the {@link ScheduledTaskRegistrar}. * * @param taskRegistrar the registrar to be configured. */ @Override public void configureTasks(ScheduledTaskRegistrar taskRegistrar) { System.err.println("假裝從數據庫中獲取到了配置好的定時任務執行計劃"); String cron = "0/10 * * * * ?"; taskRegistrar.addCronTask(() -> { System.err.println("接口定時任務執行定時任務了,執行時間為:" + dateFormat.get().format(new Date())); },cron); } }
這里通過重寫configureTasks方法,使用ScheduledTaskRegistrar對象來創建定時任務,然后表達式可以從數據庫等地方讀取,演示時候就不寫那塊代碼了,這樣可以很簡單的實現出來一個簡單的任務調度平臺
看下執行結果:
“springboot怎么通過注解、接口創建定時任務”的內容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業相關的知識可以關注億速云網站,小編將為大家輸出更多高質量的實用文章!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。