SpringBoot异步及线程池配置
2023-09-14 09:11:43 时间
异步方法注解@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
相关文章
- 补习系列(19)-springboot JPA + PostGreSQL
- springboot日志管理+集成log4j
- SpringBoot Cglib代理不生效
- springboot中配置mybatis别名该怎么写?
- springboot 集成swagger2(转)
- springboot @PropertySource+@Value注入properties配置文件属性值
- SpringBoot 配置log日志持久化
- SpringBoot最简单服务配置
- springboot+shiro:ShiroConfiguration配置
- SpringBoot 自动配置实现流程
- springboot 配置多个请求服务代理
- springboot+rabbitmq 之 消费端配置
- springboot日志配置
- SpringBoot的自动配置
- SpringBoot实例③Spring Boot 日志配置
- SpringBoot搭建聚合工程,maven打包提示【程序包xxxx找不到符号】
- 基于Java+SpringBoot+Vue前后端分离商城系统设计与实现
- Springboot扩展点之InitializingBean
- 【springboot】18、内置 Tomcat 配置和切换
- 【springboot】6、Spring Initailiz
- SpringBoot——slf4j+logback日志处理及配置详解
- Springboot整合Websocket遇到的坑_websocket session不支持序列化,无法存储至redis_Websocket相关问题总结(Session共享,用户多端登录等)