摘要:注意這時中結果為,即將原來的替換成,所以直接返回線程池執行的結果。提醒中的是你業務代碼執行的步驟。所以異步異常處理和同步相同,在這段請求中處理。比多,調用時間即發起之前。正是請求被異步化,從而使得能,即。
用法
@GetMapping("/ffffd") public Callableprocess() { return () -> { Thread.sleep(1000L); return "call"; }; } @GetMapping("/ffffd") public DeferredResult quotes() { DeferredResult deferredResult = new DeferredResult (); return deferredResult; } // In some other thread... deferredResult.setResult(data);
返回Callable和DeferredResult區別在于the return value of DeferredResult will also be produced from any thread, i.e. one that is not managed by Spring MVC.
運行時客戶端請求,DispatcherType:REQUEST 即與同步請求一樣
Controller返回Callable
HandlerMethodReturnValueHandlerComposite選出CallableMethodReturnValueHandler來處理Callable
WebAsyncManager#startCallableProcessing -> #startAsyncProcessing -> StandardServletAsyncWebRequest#startAsync
由于spring的StandardServletAsyncWebRequest內部托管J2EE容器的Request(該Request實現ServletRequest),所以調用ServletRequest#startAsync(ServletRequest, ServletResponse)生成AsyncContext托管于StandardServletAsyncWebRequest內部,該AsyncContext保存ServletRequest和ServletResponse,以便之后的DispatcherType:ASYNC請求能取出對應的ServletResponse
WebAsyncManager#startCallableProcessing 調用完畢后,向taskExecutor線程池中提交任務來執行Callable#call,注意該任務最后必定會執行WebAsyncManager#setConcurrentResultAndDispatch,即執行StandardServletAsyncWebRequest#dispatch,就是執行前面生成的AsyncContext#dispatch
DispatcherType:ASYNC 這是由AsyncContext#dispatch發起的。
注意這時RequestMappingHandlerAdapter#invokeHandlerMethod(HttpServletRequest, HttpServletResponse, HandlerMethod)中if (asyncManager.hasConcurrentResult())結果為true,即將原來的ServletInvocableHandlerMethod替換成ConcurrentResultHandlerMethod,所以invocableMethod.invokeAndHandle(webRequest, mavContainer);直接返回taskExecutor線程池執行的結果。
HandlerMethodReturnValueHandlerComposite選出你結果類型對應的ReturnValueHandler來處理你的結果。
返回客戶端。
提醒:RequestMappingHandlerAdapter#invokeHandlerMethod(HttpServletRequest, HttpServletResponse, HandlerMethod)中的invocableMethod.invokeAndHandle(webRequest, mavContainer);是你業務代碼執行的步驟。
The call to request.startAsync() returns AsyncContext which can be used for further control over async processing. For example it provides the method dispatch, that is similar to a forward from the Servlet API except it allows an application to resume request processing on a Servlet container thread.
運行時流程有點繞,沒功夫畫時序圖。
Exception Handlingwhen a Callable raises an Exception Spring MVC dispatches to the Servlet container with the Exception as the result and that leads to resume request processing with the Exception instead of a controller method return value. When using a DeferredResult you have a choice whether to call setResult or setErrorResult with an Exception instance.
所以異步異常處理和同步相同,在DispatcherType:ASYNC這段請求中處理。
The DeferredResult type also provides methods such as onTimeout(Runnable) and onCompletion(Runnable).
When using a Callable you can wrap it with an instance of WebAsyncTask which also provides registration methods for timeout and completion.
AsyncHandlerInterceptor比HandlerInterceptor多#afterConcurrentHandlingStarted,調用時間即DispatcherType:ASYNC發起之前。
HTTP Streaming正是請求被異步化,從而使得能long polling,即HTTP Streaming。
可以用ResponseBodyEmitter來創建邏輯上的Streaming,注意ResponseBodyEmitter#send的內容都會通過對應的HttpMessageConverter來轉化:
@RequestMapping("/events") public ResponseBodyEmitter handle() { ResponseBodyEmitter emitter = new ResponseBodyEmitter(); // Save the emitter somewhere.. return emitter; } // In some other thread emitter.send("Hello once"); // and again later on emitter.send("Hello again"); // and done at some point emitter.complete();
當然 ResponseBodyEmitter can also be used as the body in a ResponseEntity in order to customize the status and headers of the response.
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/71000.html
摘要:概念響應式編程,異步非阻塞就是響應式編程,與之相對應的是命令式編程。的另外一種實現方式就是消息隊列。非阻塞設計利用規范中的實現實現代碼鏈接 注: 本文是由讀者觀看小馬哥公開課視頻過程中的筆記整理而成。更多Spring Framework文章可參看筆者個人github: spring-framework-lesson 。 0. 編程模型與并發模型 Spring 5實現了一部分Reacti...
摘要:異步處理簡介地址相關系列文章異步處理詳解分析本文講到的所有特性皆是基于的,不是基于的。用于異步返回結果,使用自己的,使用負責處理它。配置執行異步操作需要用到,這個可以在用方法來提供相關文檔。 Spring MVC異步處理簡介 Github地址 相關系列文章: Servlet 3.0 異步處理詳解 Servlet 3.1 Async IO分析 本文講到的所有特性皆是基于Servlet...
摘要:這是我重新復習的原因放棄了之前自己實現的全面擁抱的這個改動是非常大的而且閱讀的源碼可以發現其中大部分函數都支持了類型檢驗和返回值提示值得閱讀 廢話不多說,直接上代碼 __auth__ = aleimu __doc__ = 學習tornado6.0+ 版本與python3.7+ import time import asyncio import tornado.gen import t...
摘要:是一個倡議,它提倡提供一種帶有非阻塞背壓的異步流處理的標準。是標準的實現之一。的實現細節請求響應的與請求響應的暴露為是請求的的消費者是響應的的生產者內部的內部 北京時間 9 月 26 日,Oracle 官方宣布 Java 11 正式發布 一、JDK HTTP Client介紹 JDK11中的17個新特性 showImg(https://segmentfault.com/img/remo...
摘要:原文鏈接編程方法論響應式與代碼設計實戰序,來自于微信公眾號次靈均閣正文內容在一月的架構和設計趨勢報告中,響應式編程和函數式仍舊編列在第一季度的早期采納者中。 原文鏈接:《Java編程方法論:響應式RxJava與代碼設計實戰》序,來自于微信公眾號:次靈均閣 正文內容 在《2019 一月的InfoQ 架構和設計趨勢報告》1中,響應式編程(Reactive Programming)和函數式...
閱讀 824·2021-09-07 09:58
閱讀 2682·2021-08-31 09:42
閱讀 2855·2019-08-30 14:18
閱讀 3086·2019-08-30 14:08
閱讀 1831·2019-08-30 12:57
閱讀 2759·2019-08-26 13:31
閱讀 1299·2019-08-26 11:58
閱讀 1052·2019-08-23 18:06