SpringBoot2.x整合线程池(ThreadPoolTaskExecutor)多个异步任务执行结果获取、异常处理

本文介绍了如何在SpringBoot2.x中整合线程池(ThreadPoolTaskExecutor)来实现多线程异步任务执行。通过示例展示了在遇到异常时的处理策略,并解释了如何收集和处理多个异步任务的结果,即使在get方法阻塞的情况下,也能保证其他任务的正常执行。

参考了这篇文章:SpringBoot2.x整合线程池(ThreadPoolTaskExecutor)

https://www.jianshu.com/p/3d875dd9d5db

异步执行结果集处理及异常处理示例:

定义一个异步任务,在入参为3时模拟抛出异常的情况

@Log4j2
@Component
public class AsyncTest {

    @Async("asyncServiceExecutor")
    public Future<String> sync(int i) {
        Date date = new Date();
        try {
            System.out.println("执行第"+i+"个");
            Thread.sleep(1000);
        } catch (InterruptedException e) {
            log.error(e.getMessage(), e);
        }
        int error = 3;
        if (i == error) {
            throw new BaseException().setParam("No", i).setParam("Date", date);
        }
        return new AsyncResult<>(String.valueOf(i) + ":  " + date.toString());
    }

}

for循环创建多个异步任务,将结果放入list中,对list进行处理,使用get虽然会阻塞但不影响其他异步任务的执行。

@Log4j2
@RestController
@RequestMapping("/
<think>我们被要求使用SpringBoot线程池来实现定时多任务启动。根据引用内容,我们知道SpringBoot内置了线程池支持,并且可以通过@Scheduled注解来创建定时任务。实际场景:假设我们有一个需求,需要定时执行两个不同的任务,例如:1.每5秒打印一次当前时间(任务1)2.每10秒打印一条固定的消息(任务2)为了使用线程池,我们可以配置一个自定义的线程池,这样定时任务就会使用我们配置的线程池来执行,而不是默认的单线程。步骤:1.创建一个SpringBoot项目(这里假设已经创建)2.配置线程池(通过配置类)3.编写定时任务方法4.在启动类上启用定时任务和异步任务根据引用[1]和引用[2],我们可以通过自定义线程池来管理定时任务。同时,引用[3]提到SpringBoot的定时任务由TaskScheduler管理,我们可以自定义TaskScheduler来使用我们自己的线程池。下面我们将通过代码示例来演示。首先,创建一个配置类来配置线程池(这里使用ThreadPoolTaskScheduler,因为定时任务需要使用TaskScheduler):</think> ### Spring Boot中使用线程池实现定时多任务的完整示例 #### 核心概念整合 1. **线程池管理**:通过自定义线程池实现任务调度管理[^1] 2. **定时任务**:使用`@Scheduled`注解创建定时任务[^3] 3. **多线程执行**:线程池分配线程执行并发任务[^2] #### 场景描述 假设我们有两个需要定时执行的业务任务: 1. **订单超时检查**:每30秒检查未支付订单 2. **数据备份任务**:每天凌晨2点执行数据库备份 #### 代码实现 ##### 1. 线程池配置类 ```java 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 ThreadPoolConfig { @Bean("taskExecutor") public Executor taskExecutor() { ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor(); executor.setCorePoolSize(5); // 核心线程数 executor.setMaxPoolSize(10); // 最大线程数 executor.setQueueCapacity(100); // 队列容量 executor.setThreadNamePrefix("TimedTask-"); // 线程名前缀 executor.initialize(); return executor; } } ``` ##### 2. 定时任务服务 ```java import org.springframework.scheduling.annotation.Async; import org.springframework.scheduling.annotation.Scheduled; import org.springframework.stereotype.Service; @Service public class TimedTaskService { // 每30秒执行订单检查 @Scheduled(fixedRate = 30000) @Async("taskExecutor") public void checkOrderTimeout() { System.out.println("[" + Thread.currentThread().getName() + "] 执行订单超时检查..."); // 实际业务逻辑:查询数据库并处理超时订单 } // 每天凌晨2点执行 (使用cron表达式) @Scheduled(cron = "0 0 2 * * ?") @Async("taskExecutor") public void backupDatabase() { System.out.println("[" + Thread.currentThread().getName() + "] 开始数据库备份..."); // 实际业务逻辑:执行数据库备份操作 } } ``` ##### 3. 主启动类 ```java import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.scheduling.annotation.EnableScheduling; @SpringBootApplication @EnableScheduling public class TimedTaskApplication { public static void main(String[] args) { SpringApplication.run(TimedTaskApplication.class, args); } } ``` #### 执行效果说明 1. 订单检查任务每30秒触发一次,由线程池自动分配线程执行 2. 数据库备份每天凌晨2点自动执行 3. 控制台输出示例: ``` [TimedTask-1] 执行订单超时检查... [TimedTask-2] 执行订单超时检查... [TimedTask-3] 开始数据库备份... ``` #### 关键点解析 1. `@EnableAsync` + `@Async`:启用异步执行并将方法标记为异步任务[^1] 2. `@EnableScheduling` + `@Scheduled`:启用定时任务调度[^3] 3. `ThreadPoolTaskExecutor`:自定义线程池参数: - 核心线程数保持活跃 - 任务队列缓存待执行任务 - 当队列满时创建新线程(不超过最大线程数) #### 实际应用场景 1. 电商平台订单管理系统 2. 金融系统每日对账 3. 数据监控系统定时采集指标 4. 日志归档清理系统 5. 报表生成系统
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值