SpringBoot入門八,添加定時(shí)任務(wù) 一.問(wèn)題描述 Task定時(shí)任務(wù)默認(rèn)都是使用單線程執(zhí)行的,如果定時(shí)任務(wù)有很多的話,那?..."/>
您好,登錄后才能下訂單哦!
SpringBoot添加定時(shí)任務(wù)入門請(qǐng)看這里=>SpringBoot入門八,添加定時(shí)任務(wù)
Task定時(shí)任務(wù)默認(rèn)都是使用單線程執(zhí)行的,如果定時(shí)任務(wù)有很多的話,那么可能會(huì)導(dǎo)致很多任務(wù)無(wú)法按時(shí)準(zhǔn)確執(zhí)行,示例如下:
import java.text.SimpleDateFormat;
import java.util.Date;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Component;
@Component
public class TaskTest {
private final Logger log = LoggerFactory.getLogger(TaskTest02.class);
//輸出時(shí)間格式
private static final SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss:sss");
@Scheduled(cron = "0/15 * * * * ? ")
private void sayHello(){
String dateTime = format.format(new Date());
log.info("{} 向宇宙發(fā)出了一聲問(wèn)候: Hello World!", dateTime);
try {
Thread.sleep(10000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
@Scheduled(cron = "0/16 * * * * ? ")
private void sayHello2(){
String dateTime = format.format(new Date());
log.info("{} 向宇宙發(fā)出了一聲問(wèn)候: 你好,世界", dateTime);
}
}
當(dāng)sayHello()方法執(zhí)行的時(shí)候,因?yàn)殚L(zhǎng)時(shí)間占用任務(wù)執(zhí)行線程,導(dǎo)致sayHello2()被迫向后延時(shí)執(zhí)行,如圖:
添加以下代碼塊,可放置在任意一個(gè)類中,整個(gè)工程只需要添加一個(gè)即可
@Bean
public TaskScheduler taskScheduler() {
ThreadPoolTaskScheduler scheduler = new ThreadPoolTaskScheduler();
// 設(shè)置scheduler執(zhí)行線程為3個(gè)
scheduler.setPoolSize(3);
return scheduler;
}
添加一個(gè)配置類即可,定時(shí)任務(wù)類或方法不用做任何改變
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.scheduling.TaskScheduler;
import org.springframework.scheduling.concurrent.ThreadPoolTaskScheduler;
/**
* @描述: 多線程執(zhí)行定時(shí)任務(wù)
* @日期 2019年5月28日
*/
@Configuration
public class TaskConfig {
/**
* @描述: 所有的定時(shí)任務(wù)都放在一個(gè)線程池中,定時(shí)任務(wù)啟動(dòng)時(shí)使用不同的線程
* @return
* @日期 2019年5月28日
*/
@Bean
public TaskScheduler taskScheduler() {
ThreadPoolTaskScheduler scheduler = new ThreadPoolTaskScheduler();
// 設(shè)置scheduler執(zhí)行線程為3個(gè)
scheduler.setPoolSize(3);
return scheduler;
}
}
添加一個(gè)配置類即可(實(shí)現(xiàn)SchedulingConfigurer接口),定時(shí)任務(wù)類或方法不用做任何改變
import java.util.concurrent.Executors;
import org.springframework.context.annotation.Configuration;
import org.springframework.scheduling.annotation.SchedulingConfigurer;
import org.springframework.scheduling.config.ScheduledTaskRegistrar;
/**
* @描述: 多線程執(zhí)行定時(shí)任務(wù)
* @日期 2019年5月27日
*/
@Configuration
public class SchedulingConfig implements SchedulingConfigurer {
/**
* @描述: 所有的定時(shí)任務(wù)都放在一個(gè)線程池中,定時(shí)任務(wù)啟動(dòng)時(shí)使用不同的線程
* @param taskRegistrar
* @日期 2019年5月27日
*/
@Override
public void configureTasks(ScheduledTaskRegistrar taskRegistrar) {
//設(shè)定一個(gè)定時(shí)任務(wù)線程池,數(shù)量為3
taskRegistrar.setScheduler(Executors.newScheduledThreadPool(3));
}
}
可以看到兩個(gè)定時(shí)任務(wù)已經(jīng)分別由不同的線程執(zhí)行了
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。