SpringBoot 使用 @Async 实现异步任务调用

- 日理万妓 2024-01-17 06:28 112阅读 0赞

一、什么是“asynchronous call(异步调用)”?
一个可以无需等待被调用函数的返回值就让操作继续进行的方法(来自百度百科)。即程序在顺序执行时,不等待异步调用的语句返回结果就执行后面的程序。

二、Spring Boot 使用 @Async 注解实现异步化
我们只需要通过使用 @Async 注解就能简单的将同步函数变为异步函数,例如新建一个 Asynctask 异步任务类,源码如下。

  1. package com.example.asynctask.asynvtask;
  2. import org.springframework.scheduling.annotation.Async;
  3. import org.springframework.stereotype.Component;
  4. /**
  5. * @description
  6. * @date 2019/4/19 11:20
  7. */
  8. @Component
  9. public class Asynctask {
  10. // 任务一
  11. @Async
  12. public void doTaskOne() throws Exception {
  13. System.out.println("开始做任务一");
  14. long start = System.currentTimeMillis();
  15. Thread.sleep(3000);
  16. long end = System.currentTimeMillis();
  17. System.out.println("完成任务一,耗时:" + (end - start) + "毫秒");
  18. }
  19. // 任务二
  20. @Async
  21. public void doTaskTwo() throws Exception {
  22. System.out.println("开始做任务二");
  23. long start = System.currentTimeMillis();
  24. Thread.sleep(5000);
  25. long end = System.currentTimeMillis();
  26. System.out.println("完成任务二,耗时:" + (end - start) + "毫秒");
  27. }
  28. // 任务3
  29. @Async
  30. public void doTaskThree() throws Exception {
  31. System.out.println("开始做任务三");
  32. long start = System.currentTimeMillis();
  33. Thread.sleep(8000);
  34. long end = System.currentTimeMillis();
  35. System.out.println("完成任务三,耗时:" + (end - start) + "毫秒");
  36. }
  37. }

为了让 @Async 注解能够生效,还需要在 SpringBoot 的主程序中配置 @EnableAsync,如下所示。

  1. package com.example.asynctask;
  2. import org.springframework.boot.SpringApplication;
  3. import org.springframework.boot.autoconfigure.SpringBootApplication;
  4. import org.springframework.scheduling.annotation.EnableAsync;
  5. @SpringBootApplication
  6. @EnableAsync
  7. public class AsynctaskApplication {
  8. public static void main(String[] args) {
  9. SpringApplication.run(AsynctaskApplication.class, args);
  10. }
  11. }

编写测试类,源码如下。

  1. package com.example.asynctask.controller;
  2. import com.example.asynctask.asynvtask.Asynctask;
  3. import org.springframework.web.bind.annotation.RequestMapping;
  4. import org.springframework.web.bind.annotation.RestController;
  5. import javax.annotation.Resource;
  6. /**
  7. * @description @Async 注解实现异步任务
  8. * @date 2019/4/19 11:20
  9. */
  10. @RestController
  11. @RequestMapping("/test")
  12. public class AsynctaskController {
  13. @Resource
  14. private Asynctask asynctask;
  15. @RequestMapping("/task")
  16. public String task2() throws Exception {
  17. asynctask.doTaskOne();
  18. asynctask.doTaskTwo();
  19. asynctask.doTaskThree();
  20. return "===== test ok =====";
  21. }
  22. }

测试结果:反复执行时,可能出现多种不同的测试结果(任务1、2、3执行顺序不同),以下是一种情况。

开始做任务三
开始做任务一
开始做任务二
完成任务一,耗时:2992毫秒
完成任务二,耗时:4987毫秒
完成任务三,耗时:7980毫秒

三、注意事项
1、在 @SpringBootApplication 启动类添加注解@EnableAsync;
2、异步方法使用注解 @Async ,返回值为 void 或者 Future;
3、切记一点 ,异步方法和调用方法要分别写在不同的类中,如果写在一个类中,是没有效果的。

发表评论

表情:
评论列表 (有 0 条评论,112人围观)

还没有评论,来说两句吧...

相关阅读

    相关 SpringBoot使用@Async异步调用方法

    1、业务场景,在使用阿里大鱼发送短信时,不知因何原因,后端接口发送短信较耗时,前端请求后端接口很快出现请求错误,这跟前端设置的响应时间相关,可以让前端增加时间,但这并不是一个好