在Spring Boot中实现多线程任务调度
1. Spring Boot中的任务调度
Spring Boot通过集成Spring框架的Task Execution和Scheduling支持,提供了强大的任务调度功能。我们可以利用这些特性来实现多线程任务调度,处理定时任务和异步任务等需求。
2. 使用@Scheduled注解
Spring Boot中的@Scheduled注解可以很方便地定义定时任务。我们可以将一个方法标记为定时任务,并设置定时执行的周期或者固定延迟时间。
package cn.juwatech.scheduling;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Component;
@Component
public class ScheduledTasks {
@Scheduled(fixedRate = 5000)
public void reportCurrentTime() {
System.out.println("Current time: " + System.currentTimeMillis());
}
@Scheduled(cron = "0 0 12 * * ?")
public void executeDailyTask() {
System.out.println("Executing daily task at noon.");
}
}
上述示例中,reportCurrentTime
方法每隔5秒输出当前时间,executeDailyTask
方法每天中午12点执行一次任务。
3. 使用ThreadPoolTaskExecutor实现异步任务
除了定时任务,Spring Boot还支持异步任务的处理。我们可以配置ThreadPoolTaskExecutor来执行异步任务,实现并发处理。
package cn.juwatech.async;
import org.springframework.scheduling.annotation.Async;
import org.springframework.stereotype.Service;
@Service
public class AsyncTaskService {
@Async
public void executeAsyncTask(int taskNumber) {
System.out.println("Executing async task: " + taskNumber);
}
}
在上述示例中,executeAsyncTask
方法被@Async注解标记,表明这是一个异步任务。Spring Boot会自动创建线程池来执行这些异步任务。
4. 配置线程池
为了更好地控制线程池的行为,我们可以在Spring Boot中配置ThreadPoolTaskExecutor bean。
package cn.juwatech.config;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.scheduling.annotation.EnableAsync;
import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor;
import java.util.concurrent.Executor;
@Configuration
@EnableAsync
public class AsyncConfig {
@Bean(name = "taskExecutor")
public Executor taskExecutor() {
ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor();
executor.setCorePoolSize(5);
executor.setMaxPoolSize(10);
executor.setQueueCapacity(25);
executor.setThreadNamePrefix("AsyncTask-");
executor.initialize();
return executor;
}
}
在上述示例中,配置了一个名为taskExecutor的线程池,设置了核心线程数、最大线程数、队列容量等参数。
5. 结合业务场景
实际应用中,我们可以根据业务需求,结合定时任务和异步任务,实现复杂的任务调度逻辑。例如,定时从外部接口获取数据并异步处理,定时生成报表等。
package cn.juwatech.service;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Service;
@Service
public class DataProcessingService {
@Autowired
private ExternalAPIService externalAPIService;
@Autowired
private AsyncTaskService asyncTaskService;
@Scheduled(cron = "0 0 1 * * ?")
public void processDataFromExternalAPI() {
String data = externalAPIService.getData();
asyncTaskService.processData(data);
}
}
上述示例中,定时任务processDataFromExternalAPI
每天凌晨1点从外部API获取数据,并通过异步任务处理数据。