异步任务的坑

Spring Boot 中编写异步任务

两个注解:

  • @EnableAsync:开启当前项目的异步功能1673349495471-7da91ddf-de95-4de5-836b-ebb0f7d167f5.png
  • @Async:当前方法标记为异步方法

注意一个规则:有没有返回值。

没有返回值的例子:

1673349355534-34135a1f-e17c-4ceb-9a81-be7558cbd770.png

返回值实现了 Future 接口:

1673349400597-84c8f10e-335e-412b-939b-0b391842451a.png

1673349581632-25ae7686-6add-449e-8ef1-d9d17fbe83f3.png

异步任务的线程池配置

默认情况下,异步任务的线程池是怎么配置的,是否满足我们的需求呢?

配置线程池参数

默认是启动下面的线程池:

1673349814715-c05231aa-7d9e-4192-b1c9-c0f9297ff646.png

线程池对应的自动配置类如下:

1673349933823-b9d571ec-a8be-4791-af12-a6682341b62d.png

可以使用下面的参数配置异步任务线程池相关的参数:

1673349945724-acba8451-dc93-4a70-bf36-e36c82c8f792.png

1673350001120-8b9660fd-433a-4bd2-9bfb-8d2783f5ae36.png

异步任务返回超时

对于异步任务有返回的情况,如果获取结果超时怎么办呢?

get 有重载方法可以设置超时的时间,超时之后就会抛出 TimeOut 异常:

1673350317582-04bcd2ec-801b-41b1-a12c-e6700855f532.png

没有返回值的异步任务抛异常

对于异步任务没有返回的情况(有返回的直接 get 的时候就会抛异常),但是下面的异步任务执行的时候抛出异常,但是没有任何的其他返回:

1673349434620-2087f1fd-2eb4-457c-8c05-59cd0e59c4b0.png

Spring 默认的异步任务异常处理器,会将对应的异常打印到日志里面:

1673349703211-70781dee-06c0-485d-93f3-c2dce091b9e0.png

自定义异步线程池和异常处理器

1673350135629-e8b3d879-c00b-4885-8daa-2fe8618b4cac.png

自定义异步线程池的实现:

1673350932216-d179671e-46b9-4de0-9bd2-dda0e992562b.png

1673350916513-bd9daf0b-4fc7-459b-9919-8c0a59b454c5.png

自定义异常处理器

1673351177381-738edba8-4b40-4123-bc8e-1cbcb63767bd.png

posted on 2025-10-14 23:47  chuchengzhi  阅读(7)  评论(0)    收藏  举报

导航

杭州技术博主,专注分享云计算领域实战经验、技术教程与行业洞察, 打造聚焦云计算技术的垂直博客,助力开发者快速掌握云服务核心能力。

褚成志 云计算 技术博客