第一部分: 无返回值异步任务

当没有加入异步任务的时候,我们创建一个service ,里面的方法需要等待3秒才能完成, controller层写一个测试方法调用时间返回的接口, 直接调用,

下面是service层代码部分

  1. package com.zz.amqp1.service;

  2. import org.springframework.stereotype.Service;

  3. import java.util.Date;

  4. /**

  5. * Description: 异步任务测试类

  6. * User: zhouzhou

  7. * Date: 2018-08-28

  8. * Time: 13:30

  9. */

  10. @Service

  11. public class AsyncService {

  12. public void doNoReturn(){

  13. try {

  14. // 这个方法执行需要三秒

  15. Thread.sleep(3000);

  16. System.out.println("方法执行结束" + new Date());

  17. } catch (InterruptedException e) {

  18. e.printStackTrace();

  19. }

  20. }

  21. }

下面是controller层代码部分

  1. package com.zz.amqp1.controller;

  2. import com.zz.amqp1.service.AsyncService;

  3. import org.springframework.beans.factory.annotation.Autowired;

  4. import org.springframework.web.bind.annotation.RequestMapping;

  5. import org.springframework.web.bind.annotation.RequestMethod;

  6. import org.springframework.web.bind.annotation.RestController;

  7. /**

  8. * Description: 异步任务测试类

  9. * User: zhouzhou

  10. * Date: 2018-08-28

  11. * Time: 13:33

  12. */

  13. @RestController

  14. public class AsyncController {

  15. @Autowired

  16. private AsyncService asyncService;

  17. @RequestMapping(value = "/hello",method = RequestMethod.GET)

  18. public String testAsyncNoRetrun(){

  19. long start = System.currentTimeMillis();

  20. asyncService.doNoReturn();

  21. return String.format("任务执行成功,耗时{%s}", System.currentTimeMillis() - start);

  22. }

  23. }

启动项目在, 浏览器中输入url :http://localhost:8080/hello

返回结果如下:

3000毫秒.接下来我们在方法上加上注解 @Async后, 重启项目, 刷新页面查看调用时间

  1. @Async

  2. public void doNoReturn(){

  3. try {

  4. // 这个方法执行需要三秒

  5. Thread.sleep(3000);

  6. System.out.println("方法执行结束" + new Date());

  7. } catch (InterruptedException e) {

  8. e.printStackTrace();

  9. }

  10. }

并且在主启动类上开启@EnableAsync的注解

  1. @EnableAsync // 开启异步任务

  2. @SpringBootApplication

  3. public class Amqp1Application {

  4. public static void main(String[] args) {

  5. SpringApplication.run(Amqp1Application.class, args);

  6. }

  7. }

测试完成, 异步任务如此简单,就这样.

第二部分:有返回值的异步任务

返回值用Futrue变量封装起来,下面是service层的代码

  1. @Async

  2. public Future<String> doReturn(int i){

  3. try {

  4. // 这个方法需要调用500毫秒

  5. Thread.sleep(500);

  6. } catch (InterruptedException e) {

  7. e.printStackTrace();

  8. }

  9. // 消息汇总

  10. return new AsyncResult<>(String.format("这个是第{%s}个异步调用的证书", i));

  11. }

读取的时候,记得要批量读取不能单独读取, 下面是controller层的代码

  1. @GetMapping("/hi")

  2. public Map<String, Object> testAsyncReturn() throws ExecutionException, InterruptedException {

  3. long start = System.currentTimeMillis();

  4. Map<String, Object> map = new HashMap<>();

  5. List<Future<String>> futures = new ArrayList<>();

  6. for (int i = 0; i < 10; i++) {

  7. Future<String> future = asyncService.doReturn(i);

  8. futures.add(future);

  9. }

  10. List<String> response = new ArrayList<>();

  11. for (Future future : futures) {

  12. String string = (String) future.get();

  13. response.add(string);

  14. }

  15. map.put("data", response);

  16. map.put("消耗时间", String.format("任务执行成功,耗时{%s}毫秒", System.currentTimeMillis() - start));

  17. return map;

  18. }

在浏览器输入地址:http://localhost:8080/hi

结果如下: 耗时500多毫秒的意思代表,springboot自带异步任务线程池是小于10的大小的

一定要批量读取结果, 否则不能达到异步的效果!!

1、异步方法和调用类不要在同一个类中

2、注解扫描时,要注意过滤,避免重复实例化,因为存在覆盖问题,@Async就失效了

SpringBoot异步任务, 以及带返回值的异步任务(@Async 不起作用的原因)相关推荐

  1. springboot 的异步任务 :无返回值 和有返回值

    在想要异步执行的方法上加上@Async注解,在controller上加上@EnableAsync,即可. 注:这里的异步方法,只能在本类之外调用,在本类调用是无效的. 无返回值的异步任务 servic ...

  2. async js 返回值_JS异步编程 | Async / Await / Generator 实现原理解析

    async/await实现 在多个回调依赖的场景中,尽管Promise通过链式调用取代了回调嵌套,但过多的链式调用可读性仍然不佳,流程控制也不方便,ES7 提出的async 函数,终于让 JS 对于异 ...

  3. C++ 多线程之带返回值的线程处理函数

    写在前面:         又是学C扎扎的一天,C扎扎学起来果然扎手.如果你能坚持看到文章最后,你会发现,好吧有可能你啥也发现不了,因为后面什么也没有~~~ 目录 1. 使用 async 函数创建线程 ...

  4. 定义一个带参带返回值的方法,实现输出随机数数组

    public class mains { public static void main(String[] args) { // 创建对象,对象名为hello mains hello = new ma ...

  5. Java05-day05【方法(概述、调用过程图解)、带参方法、带返回值方法、重载、方法参数传递(基本类型、引用类型)】

    java零基础入门到精通(2019版)[黑马程序员] 视频+资料:[链接:https://pan.baidu.com/s/1MdFNUADVSFf-lVw3SJRvtg   提取码:zjxs] &qu ...

  6. android cursor 实例化,为什么Cursor放到带参数带返回值方法里就报错?

    完整代码如下: 其中有大部分的代码被注释,那是可以成功运行的. 后来我想啊,游戏有好多种,但是需要统计的内容是一样的. 我就想传参 然后获得返回值的方式 来减少代码量啊. 但是把相关的查询代码放到 带 ...

  7. 实验3.1 简单实现Intent带返回值的跳转

    在这里实现的功能是当点击listview的某一子项是,启动一个确认删除相应记录的子Activity. 所以用到了带返回值的intent 父界面和子界面的前台代码 activity_main <? ...

  8. Mysql带返回值与不带返回值的2种存储过程

    过程1:带返回值: 1 drop procedure if exists proc_addNum; 2 create procedure proc_addNum (in x int,in y int, ...

  9. php异步请求$.post,如何用PHP实现异步请求、忽略返回值

    本篇文章的主要内容是用PHP实现异步请求.忽略返回值,具有一定的参考价值,有需要的朋友可以看看,希望能对你有帮助. 项目需要,场景如下: 某个条件下需要调用接口发送多个请求执行脚本,但是由于每个请求下 ...

最新文章

  1. Map.keyset()
  2. cv2 orb 图像拼接_OpenCV 实现多张图像拼接
  3. 铁路 12306 网站否认发生用户信息泄漏
  4. python 中的os模块
  5. Coursera自动驾驶课程第8讲:Basics of 3D Computer Vision
  6. dubbo-快速入门-分布式RPC框架Apache Dubbo
  7. Python一键生成国庆出行攻略,助你出门远游嗨不停!
  8. Java从入门到精通 第4章 常量与变量
  9. Java图书管理系统
  10. 【第52期】游戏策划:应聘的误区你信了几个?
  11. 音频传输中的I2S协议
  12. 只言片语 —— eFPGA
  13. python---exception handing and testing
  14. Java自学1(哭唧唧又重头开始学了)
  15. 1分钟查找是退回件的快递单号
  16. 【华为诺亚方舟实验室】2021届毕业生招聘
  17. 【计算机图形学】实验报告1用OpenGL画线命令绘制一个多边构成图形或场景
  18. maven错误Unknown lifecycle phase “build“. You must specify a valid lifecycle phase or a goal in the fo
  19. E03.02 Saudi Crown Prince Is Held Responsible for Khashoggi Killing in U.S. Report
  20. 海信电视云账号连不上服务器,海信云账号如何使用?图文教程详解

热门文章

  1. ext列表禁止滑动_后台列表设计避坑指南(下)
  2. 北外计算机专业,计算机系
  3. 检验多重共线性matlab_异方差太难?检验通不过?横截面分析难题的十大暴击!...
  4. html¥符号代码是什么,html怎么特殊符号赋
  5. 函数二的变量作用域,多函数执行,返回值,函数参数,拆包,引用
  6. 解决 LaTeX Error: File `.sty‘ not found.,直接进行本地导入就好了,暂时解决而已
  7. GitHub Pages自定义域名如何支持https
  8. leetcode 870.优势洗牌
  9. LeetCode刷题(1)
  10. 2的负x次幂图像_数学| NO.2,3函数 T51