SpringBoot作為現在最流行的Java Web框架之一,提供了一個簡單、快捷、靈活的方式來添加定時任務。本文將會從多個方面來對SpringBoot定時器作詳細的介紹,包括以下幾個方面:
一、創建定時任務
創建一個定時任務只需要一個簡單的註解即可。首先在你的主類上添加註解@EnableScheduling啟用Spring的計劃任務,然後創建一個帶有@Scheduled註解的方法即可。例如:
@SpringBootApplication
@EnableScheduling
public class DemoApplication {
@Scheduled(cron = "0 0 1 * * ?")
public void task() {
// handle task
}
public static void main(String[] args) {
SpringApplication.run(DemoApplication.class, args);
}
}
上述代碼創建了一個名為task()的任務,它將在每天1點執行。可以通過配置不同的cron表達式來定製不同的執行頻率。
二、並行執行與同步執行
默認情況下,SpringBoot的任務是同步執行的,這意味着一個任務將會在上一個任務完成之後才會執行。如果想要並行執行任務需要在方法上添加@Async註解:
@Scheduled(fixedDelay = 1000)
@Async
public void task() {
// handle task
System.out.println(Thread.currentThread().getName() + " 執行完成!");
}
上述代碼將定時任務進行並行化,任務將會異步執行,並且@Async註解要和@Configuration、@EnableAsync註解一起使用。
三、使用線程池
大型應用中應該使用線程池來執行任務,而不是每次都新建一個線程。使用線程池可以提高任務的處理速度,並且能夠更好的管理資源。
下面是使用線程池的一個例子:
@Configuration
@EnableScheduling
public class ScheduleConfig implements SchedulingConfigurer {
@Override
public void configureTasks(ScheduledTaskRegistrar taskRegistrar) {
ThreadPoolTaskScheduler threadPoolTaskScheduler = new ThreadPoolTaskScheduler();
threadPoolTaskScheduler.setPoolSize(10);
threadPoolTaskScheduler.initialize();
taskRegistrar.setTaskScheduler(threadPoolTaskScheduler);
}
@Scheduled(fixedDelay = 1000)
public void task() {
//handle task
}
}
通過實現SchedulingConfigurer接口,可以配置使用線程池進行任務定時處理。ThreadPoolTaskScheduler是Spring提供的一種基於線程池的TaskScheduler,它可以設置線程數量、隊列容量等參數。
四、使用Spring自帶的定時任務組件
Spring Boot除了提供了自帶的@Scheduled註解,還提供了自帶的定時任務組件——ScheduledExecutorService,它提供了更加複雜的定時任務控制。以下是使用自帶的定時任務組件的一個例子:
@Configuration
@EnableAsync
public class ScheduleConfig {
private static final ScheduledExecutorService executorService = new ScheduledThreadPoolExecutor(5);
public static ScheduledExecutorService getExecutorService() {
return executorService;
}
@Bean
public TaskExecutor taskExecutor() {
ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor();
executor.setCorePoolSize(4);
executor.setMaxPoolSize(8);
executor.setQueueCapacity(10000);
executor.setRejectedExecutionHandler(new ThreadPoolExecutor.CallerRunsPolicy());
return executor;
}
}
上述代碼創建了一個包含5個線程的ScheduledExecutorService線程池,並使用@Bean註解在SpringBoot中創建了一個TaskExecutor對象。需要注意到的是,為了支持異步調用,這裡使用了@EnableAsync註解。
五、使用第三方定時任務組件
Spring Boot並不能解決所有的定時任務問題,有時候需要考慮使用第三方的定時任務組件來達到更好的定時任務控制。以下是使用Quartz定時任務組件的一個例子:
@Configuration
public class ScheduleConfig {
@Bean(name = "jobDetail")
public MethodInvokingJobDetailFactoryBean detailFactoryBean(ScheduleTask task) {// ScheduleTask為需要執行的任務
MethodInvokingJobDetailFactoryBean jobDetail = new MethodInvokingJobDetailFactoryBean();
/* 是否並發執行 */
jobDetail.setConcurrent(false);
/* 設置任務的名字 */
jobDetail.setName("srd-11111");
/* 設置任務的分組,這些屬性都可以存儲在數據庫中,在多任務的時候使用 */
jobDetail.setGroup("srd");
/*
* 為需要執行的實體類對應的對象
*/
jobDetail.setTargetObject(task);
/*
* srd()方法為需要執行的方法 這個方法是要反覆執行的
*/
jobDetail.setTargetMethod("srd");
return jobDetail;
}
@Bean(name = "jobTrigger")
public SimpleTriggerFactoryBean simpleTriggerFactoryBean(@Qualifier("jobDetail") MethodInvokingJobDetailFactoryBean jobDetail) {
SimpleTriggerFactoryBean factoryBean = new SimpleTriggerFactoryBean();
factoryBean.setJobDetail(jobDetail.getObject());
/* 設置觸發時間 */
factoryBean.setStartDelay(0);// 設置執行周期
factoryBean.setRepeatInterval(10000);
factoryBean.setRepeatCount(100);
return factoryBean;
}
@Bean(name = "scheduler")
public SchedulerFactoryBean schedulerFactory(@Qualifier("jobTrigger") Trigger cronJobTrigger) {
SchedulerFactoryBean bean = new SchedulerFactoryBean();
/* 用於quartz集群,QuartzScheduler 啟動時更新己存在的Job */
bean.setOverwriteExistingJobs(true);
/* 延時啟動,應用啟動1秒後 */
bean.setStartupDelay(1);
/* 註冊觸發器 */
bean.setTriggers(cronJobTrigger);
return bean;
}
}
上述代碼創建了一個Quartz定時任務組件,並且使用@Bean註解註冊了需要執行的任務、任務的觸發器和任務組件本身。
總結
本文從創建定時任務、並行執行與同步執行、使用線程池、使用Spring自帶的定時任務組件和使用第三方定時任務組件這幾個方面詳細的介紹了SpringBoot定時器的使用方法,希望這篇文章對你有所幫助。
原創文章,作者:小藍,如若轉載,請註明出處:https://www.506064.com/zh-hant/n/259428.html