詳解SpringBoot Schedule配置
1. 定時(shí)任務(wù)實(shí)現(xiàn)方式
定時(shí)任務(wù)實(shí)現(xiàn)方式:
- Java自帶的java.util.Timer類,這個(gè)類允許你調(diào)度一個(gè)java.util.TimerTask任務(wù)。使用這種方式可以讓你的程序按照某一個(gè)頻度執(zhí)行,但不能在指定時(shí)間運(yùn)行。一般用的較少,這篇文章將不做詳細(xì)介紹。
- 使用Quartz,這是一個(gè)功能比較強(qiáng)大的的調(diào)度器,可以讓你的程序在指定時(shí)間執(zhí)行,也可以按照某一個(gè)頻度執(zhí)行,配置起來(lái)稍顯復(fù)雜,有空介紹。
- SpringBoot自帶的Scheduled,可以將它看成一個(gè)輕量級(jí)的Quartz,而且使用起來(lái)比Quartz簡(jiǎn)單許多,本文主要介紹。
定時(shí)任務(wù)執(zhí)行方式:
- 單線程(串行)
- 多線程(并行)
2. 創(chuàng)建定時(shí)任務(wù)
package com.autonavi.task.test;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Component;
import com.autonavi.task.ScheduledTasks;
@Component
public class ScheduledTest {
private static final Logger logger = LoggerFactory.getLogger(ScheduledTasks.class);
@Scheduled(cron="0 0/2 * * * ?")
public void executeFileDownLoadTask() {
// 間隔2分鐘,執(zhí)行任務(wù)
Thread current = Thread.currentThread();
System.out.println("定時(shí)任務(wù)1:"+current.getId());
logger.info("ScheduledTest.executeFileDownLoadTask 定時(shí)任務(wù)1:"+current.getId()+ ",name:"+current.getName());
}
}
@Scheduled 注解用于標(biāo)注這個(gè)方法是一個(gè)定時(shí)任務(wù)的方法,有多種配置可選。cron支持cron表達(dá)式,指定任務(wù)在特定時(shí)間執(zhí)行;fixedRate以特定頻率執(zhí)行任務(wù);fixedRateString以string的形式配置執(zhí)行頻率。
3. 啟動(dòng)定時(shí)任務(wù)
@SpringBootApplication
@EnableScheduling
public class App {
private static final Logger logger = LoggerFactory.getLogger(App.class);
public static void main(String[] args) {
SpringApplication.run(App.class, args);
logger.info("start");
}
}
其中 @EnableScheduling 注解的作用是發(fā)現(xiàn)注解@Scheduled的任務(wù)并后臺(tái)執(zhí)行。
Springboot本身默認(rèn)的執(zhí)行方式是串行執(zhí)行,也就是說(shuō)無(wú)論有多少task,都是一個(gè)線程串行執(zhí)行,并行需手動(dòng)配置
4. 并行任務(wù)
繼承SchedulingConfigurer類并重寫其方法即可,如下:
@Configuration
@EnableScheduling
public class ScheduleConfig implements SchedulingConfigurer {
@Override
public void configureTasks(ScheduledTaskRegistrar taskRegistrar) {
taskRegistrar.setScheduler(taskExecutor());
}
@Bean(destroyMethod="shutdown")
public Executor taskExecutor() {
return Executors.newScheduledThreadPool(100);
}
}
再次執(zhí)行之前的那個(gè)Demo,會(huì)欣然發(fā)現(xiàn)已經(jīng)是并行執(zhí)行了!
5. 異步并行任務(wù)
import org.springframework.scheduling.TaskScheduler;
import org.springframework.scheduling.annotation.AsyncConfigurer;
import org.springframework.scheduling.annotation.EnableAsync;
import org.springframework.scheduling.annotation.EnableScheduling;
import org.springframework.scheduling.annotation.SchedulingConfigurer;
import org.springframework.scheduling.concurrent.ThreadPoolTaskScheduler;
import org.springframework.scheduling.config.ScheduledTaskRegistrar;
@Configuration
@EnableScheduling
@EnableAsync(
mode = AdviceMode.PROXY, proxyTargetClass = false,
order = Ordered.HIGHEST_PRECEDENCE
)
@ComponentScan(
basePackages = "hello"
)
public class RootContextConfiguration implements
AsyncConfigurer, SchedulingConfigurer {
@Bean
public ThreadPoolTaskScheduler taskScheduler()
{
ThreadPoolTaskScheduler scheduler = new ThreadPoolTaskScheduler();
scheduler.setPoolSize(20);
scheduler.setThreadNamePrefix("task-");
scheduler.setAwaitTerminationSeconds(60);
scheduler.setWaitForTasksToCompleteOnShutdown(true);
return scheduler;
}
@Override
public Executor getAsyncExecutor()
{
Executor executor = this.taskScheduler();
return executor;
}
@Override
public void configureTasks(ScheduledTaskRegistrar registrar)
{
TaskScheduler scheduler = this.taskScheduler();
registrar.setTaskScheduler(scheduler);
}
}
在啟動(dòng)的main方法加入額外配置:
@SpringBootApplication
public class Application {
public static void main(String[] args) throws Exception {
AnnotationConfigApplicationContext rootContext =
new AnnotationConfigApplicationContext();
rootContext.register(RootContextConfiguration.class);
rootContext.refresh();
}
}
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
- Spring boot如何通過(guò)@Scheduled實(shí)現(xiàn)定時(shí)任務(wù)及多線程配置
- springboot 定時(shí)任務(wù)@Scheduled實(shí)現(xiàn)解析
- springboot schedule 解決定時(shí)任務(wù)不執(zhí)行的問(wèn)題
- SpringBoot2 task scheduler 定時(shí)任務(wù)調(diào)度器四種方式
- springboot集成schedule實(shí)現(xiàn)定時(shí)任務(wù)
- Spring Boot利用@Async異步調(diào)用:ThreadPoolTaskScheduler線程池的優(yōu)雅關(guān)閉詳解
- spring-boot通過(guò)@Scheduled配置定時(shí)任務(wù)及定時(shí)任務(wù)@Scheduled注解的方法
- SpringBoot定時(shí)任務(wù)兩種(Spring Schedule 與 Quartz 整合 )實(shí)現(xiàn)方法
- SpringBoot配置及使用Schedule過(guò)程解析
相關(guān)文章
關(guān)于Spring Boot和Kotlin的聯(lián)合開(kāi)發(fā)
這篇文章主要介紹了關(guān)于Spring Boot和Kotlin的聯(lián)合開(kāi)發(fā),需要的朋友可以參考下2017-06-06
idea查看properties中文變成unicode碼的解決方案
這篇文章主要介紹了idea查看properties中文變成unicode碼的解決方案,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2024-06-06
Java字符編碼簡(jiǎn)介_(kāi)動(dòng)力節(jié)點(diǎn)Java學(xué)院整理
這篇文章主要介紹了Java字符編碼簡(jiǎn)介,本文主要包括以下幾個(gè)方面:編碼基本知識(shí),Java,系統(tǒng)軟件,url,工具軟件等,感興趣的朋友一起看看吧2017-08-08
java實(shí)現(xiàn)Fibonacci算法實(shí)例
這篇文章主要介紹了java實(shí)現(xiàn)Fibonacci算法的方法,以實(shí)例形式較為詳細(xì)的分析了java實(shí)現(xiàn)Fibonacci算法的原理與相關(guān)技巧,具有一定參考借鑒價(jià)值,需要的朋友可以參考下2015-09-09
Mybatis模糊查詢和動(dòng)態(tài)sql語(yǔ)句的用法
今天小編就為大家分享一篇關(guān)于Mybatis模糊查詢和動(dòng)態(tài)sql語(yǔ)句的用法,小編覺(jué)得內(nèi)容挺不錯(cuò)的,現(xiàn)在分享給大家,具有很好的參考價(jià)值,需要的朋友一起跟隨小編來(lái)看看吧2019-03-03
MyBatis中動(dòng)態(tài)sql的實(shí)現(xiàn)方法示例
這篇文章主要給大家介紹了關(guān)于MyBatis中動(dòng)態(tài)sql的實(shí)現(xiàn)方法,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2018-11-11
netty?pipeline中的inbound和outbound事件傳播分析
這篇文章主要為大家介紹了netty?pipeline中的inbound和outbound事件傳播分析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-04-04
解決mybatis使用foreach批量insert異常的問(wèn)題
這篇文章主要介紹了解決mybatis使用foreach批量insert異常的問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2021-01-01

