SpringBoot异步及线程池配置
2024-08-29 06:15:51
异步方法注解@Async
在SpringBoot中进行异步处理,可以使用异步注解@Async和@EnableAsync。
@Async注解表示异步,如:@Async("asyncServiceExecutor"),
后面的参数asyncServiceExecutor对应于自定义的线程池配置类(在以下例子中为ExecutorConfig) 中的线程池方法名
如果不写后面的参数,直接用@Async,则是使用默认的线程池。
Future实现类获取异步处理结果
如果想要获取异步处理的结果,可以通过Future接口的实现类调用get()方法获得。
Future接口的常见实现类有FutureTask。
在SpringBoot中,一般用 AsyncResult作为异步结果。
示例
注意:以下示例中的@Slf4j注解是属于lombok的注解,如果不想使用lombok,可以直接用常规的日志声明变量代替。
1.AsyncService如下:
@Component
@Slf4j
public class AsyncService {
/**
* @Async注解表示异步,后面的参数对应于线程池配置类ExecutorConfig中的方法名asyncServiceExecutor(),
* 如果不写后面的参数,直接使用@Async注解,则是使用默认的线程池
* Future<String>为异步返回的结果。可以通过get()方法获取结果。
*
*/
@Async("asyncServiceExecutor")
public Future<String> getDataResult( ){
log.info("开始异步处理");
String result="asyncResultTest";
return new AsyncResult<String>(result);
}
}
线程池ThreadPoolTaskExecutor
SpringBoot中的线程池一般用ThreadPoolTaskExecutor 类。
ThreadPoolTaskExecutor继承关系如下:
ThreadPoolTaskExecutor extends ExecutorConfigurationSupport implements AsyncListenableTaskExecutor, SchedulingTaskExecutor
关系结构图为:
2.自定义线程池配置如下:
@Slf4j
@Configuration
public class ExecutorConfig {
@Bean
public Executor asyncServiceExecutor() {
log.info("start asyncServiceExecutor");
ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor();
//配置核心线程数
executor.setCorePoolSize(5);
//配置最大线程数
executor.setMaxPoolSize(5);
//配置队列大小
executor.setQueueCapacity(99999);
//配置线程池中的线程的名称前缀
executor.setThreadNamePrefix("async-service-");
// 设置拒绝策略:当pool已经达到max size的时候,如何处理新任务
// CALLER_RUNS:不在新线程中执行任务,而是有调用者所在的线程来执行
executor.setRejectedExecutionHandler(new ThreadPoolExecutor.CallerRunsPolicy());
//执行初始化
executor.initialize();
return executor;
}
}
3.UserService 如下:
@Service
@Slf4j
public class UserService {
@Autowired
private AsyncService asyncService;
/**
* 调用异步服务,获取异步结果。
* @return
*/
public String getAsyncResult() {
Future<String> future=asyncService.getDataResult();
String result=null;
try{
result =future.get();
}catch (InterruptedException | ExecutionException e) {
log.error("error:{}",e.getMessage());
}
log.info("异步处理结果为:{}",result);
return result;
}
}
@EnableAsync开启异步
@EnableAsync表示开启异步,可以放在@Controller层上方,也可以放在Application类的上方。
@Controller
@EnableAsync
public class UserController {
@Autowired
private UserService userService;
@GetMapping("/user/query")
@ResponseBody
public String getUserData(){
return userService.getAsyncResult();
}
}
参考资料:
https://blog.csdn.net/boling_cavalry/article/details/79120268
最新文章
- spring mvc 项目聚合
- 《剑指offer》面试题11: 数值的整数次方
- 【图像处理】第三次实验:JPEG图像压缩
- Android中的Binder机制的简要理解
- Loadrunner的字符串函数
- Linux线程-pthread_join
- Linux给指定用户或全部用户(已登录)发送消息
- VR是TAA的终结者吗?
- [css] haslayout
- [转]linux之less命令
- PHP适合做大型网站吗?
- Nopcommerce架构浅谈之文件结构
- delphi编写dll心得, 谢谢原作者的分享。转
- linux下添加中文输入法
- Quiz 6b Question 7————An Introduction to Interactive Programming in Python
- MVC 的 视图中 @section 是什么作用?
- 【刷水】之USACO2008资格赛(Bzoj1599-1603)
- rm: cannot remove &#39; xxx&#39;: Permission denied
- Ubuntu18.04 下的Gif录制工具
- git操作手册
热门文章
- MySQLNonTransientConnectionException: Could not create connection to database server.
- 【开发工具】-Idea代码提示忽略大小写
- ar 解压一个.a文件报错: xxx.a is a fat file (use libtool(1) or lipo(1) and ar(1) on it)
- (摘录笔记)JAVA学习笔记SSH整合搭建项目
- Hive Lateral View
- day 05 预科
- Centos7.3安装nexus-3.14.0-04
- 免费的天气API测试接口
- 浅谈Python设计模式 - 单例模式
- Linux忘记root密码,进入单用户模式,切换运行级别,切换用户