一:任务

1.任务

  使用Runnable异步处理Rest服务

  使用DefaultResult异步处理Rest服务

  异步处理的配置

2.原理图说明

  

二:Callable进行异步处理

1.程序

  新建一个anysc的包

 1 package com.cao.web.async;
 2
 3 import java.util.concurrent.Callable;
 4
 5 import org.slf4j.Logger;
 6 import org.slf4j.LoggerFactory;
 7 import org.springframework.web.bind.annotation.RequestMapping;
 8 import org.springframework.web.bind.annotation.RestController;
 9
10 @RestController
11 public class AsyncController {
12     private Logger logger=LoggerFactory.getLogger(getClass());
13
14     @RequestMapping("/order")
15     public Callable<String> order() throws Exception {
16         logger.info("主线程开始");
17         //业务逻辑放在副线程中
18         Callable<String> result=new Callable<String>() {
19
20             @Override
21             public String call() throws Exception {
22                 logger.info("副线程开始");
23                 Thread.sleep(5000);
24                 logger.info("副线程返回");
25                 return "success";
26             }
27
28         };
29
30         logger.info("主线程返回");
31
32         return result;
33     }
34
35 }

2.效果

  重点关注时间

  

三:使用DeferredResult

1.问题

  方式一是有问题的,因为副线程是需要主线程调用起来的。

  是写在主线程中的。

  有些场景是不合适的。

  线程间使用DeferredResult沟通起来。

2.场景如下:

  

3.程序

  程序太多,有点复杂

  控制器

 1 package com.cao.web.async;
 2
 3 import java.util.concurrent.Callable;
 4
 5 import org.apache.commons.lang.RandomStringUtils;
 6 import org.slf4j.Logger;
 7 import org.slf4j.LoggerFactory;
 8 import org.springframework.beans.factory.annotation.Autowired;
 9 import org.springframework.web.bind.annotation.RequestMapping;
10 import org.springframework.web.bind.annotation.RestController;
11 import org.springframework.web.context.request.async.DeferredResult;
12
13 @RestController
14 public class AsyncController {
15     private Logger logger=LoggerFactory.getLogger(getClass());
16     @Autowired
17     private Queue queue;
18
19     @Autowired
20     private DeferredResultHolder deferredResultHolder;
21
22     /**
23      * 主要是验证Callable
24      * @return
25      * @throws Exception
26      */
27     @RequestMapping("/order")
28     public Callable<String> order() throws Exception {
29         logger.info("主线程开始");
30         //业务逻辑放在副线程中
31         Callable<String> result=new Callable<String>() {
32
33             @Override
34             public String call() throws Exception {
35                 logger.info("副线程开始");
36                 Thread.sleep(5000);
37                 logger.info("副线程返回");
38                 return "success";
39             }
40
41         };
42
43         logger.info("主线程返回");
44
45         return result;
46     }
47     /**
48      * 主要是验证
49      * @return
50      * @throws Exception
51      */
52     @RequestMapping("/newOrder")
53     public DeferredResult<String> newOrder() throws Exception {
54         logger.info("主线程开始");
55         //
56         String oderNumber=RandomStringUtils.randomNumeric(8);
57         queue.setPlaceOrder(oderNumber);
58         DeferredResult<String> result=new DeferredResult<>();
59         deferredResultHolder.getMap().put(oderNumber, result);
60         logger.info("主线程返回");
61
62         return result;
63     }
64
65 }

  queue.java

 1 package com.cao.web.async;
 2
 3 import org.slf4j.Logger;
 4 import org.slf4j.LoggerFactory;
 5 import org.springframework.stereotype.Component;
 6
 7 @Component
 8 public class Queue {
 9     private String placeOrder;
10     private String completeOrder;
11
12     private Logger logger=LoggerFactory.getLogger(getClass());
13
14     public String getPlaceOrder() {
15         return placeOrder;
16     }
17     public void setPlaceOrder(String placeOrder) throws Exception {
18         new Thread(() -> {
19             logger.info("接到下单请求");
20             try {
21                 Thread.sleep(2000);
22             } catch (InterruptedException e) {
23                 e.printStackTrace();
24             }
25             // 表示处理完成,应用2将结果返回给了completeOrder
26             this.completeOrder = placeOrder;
27             logger.info("下单请求处理完毕" + placeOrder);
28         }
29
30         ).start();
31
32     }
33     public String getCompleteOrder() {
34         return completeOrder;
35     }
36     public void setCompleteOrder(String completeOrder) {
37         this.completeOrder = completeOrder;
38     }
39
40 }

  deferredResultHolder.java

 1 package com.cao.web.async;
 2
 3 import java.util.HashMap;
 4 import java.util.Map;
 5
 6 import org.springframework.stereotype.Component;
 7 import org.springframework.web.context.request.async.DeferredResult;
 8
 9 @Component
10 public class DeferredResultHolder {
11     //一个是订单号,一个是订单号的处理结果
12     private Map<String,DeferredResult<String>> map=new HashMap<>();
13     public Map<String,DeferredResult<String>> getMap(){
14         return map;
15     }
16     public void setMap(Map<String,DeferredResult<String>> map) {
17         this.map=map;
18     }
19 }

  QueueListener.java

 1 package com.cao.web.async;
 2
 3 import static org.springframework.test.web.servlet.result.MockMvcResultHandlers.log;
 4
 5 import org.apache.commons.lang.StringUtils;
 6 import org.slf4j.Logger;
 7 import org.slf4j.LoggerFactory;
 8 import org.springframework.beans.factory.annotation.Autowired;
 9 import org.springframework.context.ApplicationListener;
10 import org.springframework.context.event.ContextRefreshedEvent;
11 import org.springframework.stereotype.Component;
12
13 @Component
14 public class QueueListener implements ApplicationListener<ContextRefreshedEvent>{
15     @Autowired
16     private Queue queue;
17
18     @Autowired
19     private DeferredResultHolder deferredResultHolder;
20
21     private Logger logger=LoggerFactory.getLogger(getClass());
22
23     @Override
24     public void onApplicationEvent(ContextRefreshedEvent event) {
25         new Thread(() -> {
26             while (true) {
27                 if (StringUtils.isNotBlank(queue.getCompleteOrder())) {
28                     String orderNumber = queue.getCompleteOrder();
29                     logger.info("返回订单处理结果" + orderNumber);
30                     deferredResultHolder.getMap().get(orderNumber).setResult("place order success");
31                     queue.setCompleteOrder(null);
32                 } else {
33                     try {
34                         Thread.sleep(100);
35                     } catch (InterruptedException e) {
36                         // TODO Auto-generated catch block
37                         e.printStackTrace();
38                     }
39                 }
40             }
41         }).start();
42
43
44     }
45
46
47 }

  

4.效果

  前端效果

  

  控制台效果

  

三:异步线程的配置

1.说明

  对于拦截器,与同步的拦截器不一样,仍然需要配置、

2.主要配置

  

010 异步处理Rest服务相关推荐

  1. jmeter异步请求测试_使用JMeter对异步HTTP / REST服务进行压力/负载测试

    jmeter异步请求测试 尽管我一直在使用JMeter进行Web应用程序的压力测试和负载测试好几次,但我们还是花了一些时间才弄清楚如何使用该工具测试基于异步HTTP / REST的服务. 对我们来说, ...

  2. 使用JMeter对异步HTTP / REST服务进行压力/负载测试

    尽管我一直在使用JMeter进行Web应用程序的压力测试和负载测试好几次,但我们还是花了一些时间才弄清楚如何使用该工具测试基于异步HTTP / REST的服务. 在我们这里,我是指一名程序员, Hol ...

  3. Java笔记(十七) 异步任务执行服务

    异步任务执行服务 一.基本原理和概念 一)基本接口 1)Runnable和Callable:表示要执行的异步任务. 2)Executor和ExecutorService:表示执行服务. 3)Futur ...

  4. 异步调用Web服务方法

    基于Ajax技术构建的门户是web 2.0这一代中最为成功的Web应用程序.而这块市场上iGoogle和Pageflakes这两大站点已经走在了时代的前列. 当你打开Pageflakes,将会看到如下 ...

  5. Java编程的逻辑 (77) - 异步任务执行服务

    ​本系列文章经补充和完善,已修订整理成书<Java编程的逻辑>,由机械工业出版社华章分社出版,于2018年1月上市热销,读者好评如潮!各大网店和书店有售,欢迎购买,京东自营链接:http: ...

  6. asp ajax异步请求,get方法:用户名异步请求asp服务端报错?

    js代码如下: var res = '';//常量 0用户名不存在 :1用户名存在 function Ajax(obj){ $.ajax({ type:"get", url:&qu ...

  7. Ajax异步调用Web服务的例子

    我这里是看的Dflying Chen的使用ASP.NET AJAX异步调用Web Service和页面中的类方法的一系列文章写出来的例子. 请Dflying Chen别介意.例子中没有最后一篇文章的的 ...

  8. 《Introduction to Tornado》中文翻译计划——第五章:异步Web服务

    http://www.pythoner.com/294.html 本文为<Introduction to Tornado>中文翻译,将在https://github.com/alioth3 ...

  9. 异步服务_微服务全链路异步化实践

    1. 背景 随着公司业务的发展,核心服务流量越来越大,使用到的资源也越来越多.在微服务架构体系中,大部分的业务是基于Java 语言实现的,受限于Java 的线程实现,一个Java 线程映射到一个ker ...

  10. Web服务请求异步化介绍(概念篇)

    前话 在前面的文章中,先给出了Web服务请求异步处理的压力测试报告,从数据角度描述了支持Web请求异步化的容器在不同并发用户下的处理能力及性能消耗.本文从概念的角度对于应用系统异步化,Web服务请求异 ...

最新文章

  1. Windows Virtual PC RC 发布
  2. 阿里P7架构师谈:MySQL慢查询优化、索引优化、以及表等优化总结
  3. 在SSH上传文件出现Permission denied错误
  4. AQS理解之五—并发编程中AQS的理解
  5. 反射在java中的应用_java反射机制在项目中的运用
  6. 2017.10.30 覆盖问题 思考记录
  7. Vim 命令行快捷键
  8. malloc和calloc之间的区别?
  9. 关于折半查找的细节思考
  10. unity3d之kinect 初识
  11. plsql 查看表空间使用情况
  12. hbase版本与Hadoop版本支持关系(官方)
  13. 英国开创自我修复城市概念,利用无人机和机器人自动检测道路裂缝并进行修复
  14. 什么是视频结构化?视频结构化有什么作用
  15. 搞一个yyds的京东登录页面
  16. :爱情从来就没有愚人节
  17. VBS上传文件(转载)
  18. Oracle常用字符ASCII码对应表
  19. [PS教程]怎么用PS将图片印章的背景变透明
  20. 数据库完整性之参照完整性

热门文章

  1. Atitit uke签名规范 与防伪鉴别 attilax总结
  2. Atitit 财政学概论 attilax学习笔记
  3. atitit.sql server2008导出导入数据库大的表格文件... oracle mysql
  4. paip.日志中文编码原理问题本质解决python
  5. paip.输入法编程----二级汉字2350个常用汉字2350个
  6. Rust : 简单模拟交易所与参与机构
  7. Julia : WinRPM error -----待确定
  8. 华尔街(Wall Street)与先锋集团(Vanguard )之间的战争
  9. 人民日报刊发浪潮集团董事长孙丕恕署名文章:更好实现数据共享
  10. 新兴IT企业特斯拉(四)——Model 3