异步方法注解@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

最新文章

  1. spring mvc 项目聚合
  2. 《剑指offer》面试题11: 数值的整数次方
  3. 【图像处理】第三次实验:JPEG图像压缩
  4. Android中的Binder机制的简要理解
  5. Loadrunner的字符串函数
  6. Linux线程-pthread_join
  7. Linux给指定用户或全部用户(已登录)发送消息
  8. VR是TAA的终结者吗?
  9. [css] haslayout
  10. [转]linux之less命令
  11. PHP适合做大型网站吗?
  12. Nopcommerce架构浅谈之文件结构
  13. delphi编写dll心得, 谢谢原作者的分享。转
  14. linux下添加中文输入法
  15. Quiz 6b Question 7————An Introduction to Interactive Programming in Python
  16. MVC 的 视图中 @section 是什么作用?
  17. 【刷水】之USACO2008资格赛(Bzoj1599-1603)
  18. rm: cannot remove &#39; xxx&#39;: Permission denied
  19. Ubuntu18.04 下的Gif录制工具
  20. git操作手册

热门文章

  1. MySQLNonTransientConnectionException: Could not create connection to database server.
  2. 【开发工具】-Idea代码提示忽略大小写
  3. ar 解压一个.a文件报错: xxx.a is a fat file (use libtool(1) or lipo(1) and ar(1) on it)
  4. (摘录笔记)JAVA学习笔记SSH整合搭建项目
  5. Hive Lateral View
  6. day 05 预科
  7. Centos7.3安装nexus-3.14.0-04
  8. 免费的天气API测试接口
  9. 浅谈Python设计模式 - 单例模式
  10. Linux忘记root密码,进入单用户模式,切换运行级别,切换用户