010 异步处理Rest服务
一:任务
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服务相关推荐
- jmeter异步请求测试_使用JMeter对异步HTTP / REST服务进行压力/负载测试
jmeter异步请求测试 尽管我一直在使用JMeter进行Web应用程序的压力测试和负载测试好几次,但我们还是花了一些时间才弄清楚如何使用该工具测试基于异步HTTP / REST的服务. 对我们来说, ...
- 使用JMeter对异步HTTP / REST服务进行压力/负载测试
尽管我一直在使用JMeter进行Web应用程序的压力测试和负载测试好几次,但我们还是花了一些时间才弄清楚如何使用该工具测试基于异步HTTP / REST的服务. 在我们这里,我是指一名程序员, Hol ...
- Java笔记(十七) 异步任务执行服务
异步任务执行服务 一.基本原理和概念 一)基本接口 1)Runnable和Callable:表示要执行的异步任务. 2)Executor和ExecutorService:表示执行服务. 3)Futur ...
- 异步调用Web服务方法
基于Ajax技术构建的门户是web 2.0这一代中最为成功的Web应用程序.而这块市场上iGoogle和Pageflakes这两大站点已经走在了时代的前列. 当你打开Pageflakes,将会看到如下 ...
- Java编程的逻辑 (77) - 异步任务执行服务
本系列文章经补充和完善,已修订整理成书<Java编程的逻辑>,由机械工业出版社华章分社出版,于2018年1月上市热销,读者好评如潮!各大网店和书店有售,欢迎购买,京东自营链接:http: ...
- asp ajax异步请求,get方法:用户名异步请求asp服务端报错?
js代码如下: var res = '';//常量 0用户名不存在 :1用户名存在 function Ajax(obj){ $.ajax({ type:"get", url:&qu ...
- Ajax异步调用Web服务的例子
我这里是看的Dflying Chen的使用ASP.NET AJAX异步调用Web Service和页面中的类方法的一系列文章写出来的例子. 请Dflying Chen别介意.例子中没有最后一篇文章的的 ...
- 《Introduction to Tornado》中文翻译计划——第五章:异步Web服务
http://www.pythoner.com/294.html 本文为<Introduction to Tornado>中文翻译,将在https://github.com/alioth3 ...
- 异步服务_微服务全链路异步化实践
1. 背景 随着公司业务的发展,核心服务流量越来越大,使用到的资源也越来越多.在微服务架构体系中,大部分的业务是基于Java 语言实现的,受限于Java 的线程实现,一个Java 线程映射到一个ker ...
- Web服务请求异步化介绍(概念篇)
前话 在前面的文章中,先给出了Web服务请求异步处理的压力测试报告,从数据角度描述了支持Web请求异步化的容器在不同并发用户下的处理能力及性能消耗.本文从概念的角度对于应用系统异步化,Web服务请求异 ...
最新文章
- Windows Virtual PC RC 发布
- 阿里P7架构师谈:MySQL慢查询优化、索引优化、以及表等优化总结
- 在SSH上传文件出现Permission denied错误
- AQS理解之五—并发编程中AQS的理解
- 反射在java中的应用_java反射机制在项目中的运用
- 2017.10.30 覆盖问题 思考记录
- Vim 命令行快捷键
- malloc和calloc之间的区别?
- 关于折半查找的细节思考
- unity3d之kinect 初识
- plsql 查看表空间使用情况
- hbase版本与Hadoop版本支持关系(官方)
- 英国开创自我修复城市概念,利用无人机和机器人自动检测道路裂缝并进行修复
- 什么是视频结构化?视频结构化有什么作用
- 搞一个yyds的京东登录页面
- :爱情从来就没有愚人节
- VBS上传文件(转载)
- Oracle常用字符ASCII码对应表
- [PS教程]怎么用PS将图片印章的背景变透明
- 数据库完整性之参照完整性
热门文章
- Atitit uke签名规范 与防伪鉴别 attilax总结
- Atitit 财政学概论 attilax学习笔记
- atitit.sql server2008导出导入数据库大的表格文件... oracle mysql
- paip.日志中文编码原理问题本质解决python
- paip.输入法编程----二级汉字2350个常用汉字2350个
- Rust : 简单模拟交易所与参与机构
- Julia : WinRPM error -----待确定
- 华尔街(Wall Street)与先锋集团(Vanguard )之间的战争
- 人民日报刊发浪潮集团董事长孙丕恕署名文章:更好实现数据共享
- 新兴IT企业特斯拉(四)——Model 3