文章目錄
1.4 function Endpoints
輕量的Spring mvc,類似requestmapping。
1.5 URI Links
Work with URI Links
後期再瞭解。
1.6 異步請求
MVC集成和擴展了Servlet 3.0的異步請求處理
-
controller方法返回
DeferredResult
和Callable
提供單個方法的異步支持。 -
Controllers can stream multiple values, including
SSE
andraw data
. -
Controllers can
use reactive clients
andreturn reactive types
for response handling.
1.6.1 DeferredResult
異步請求開啓後,任何返回值可以被封裝成DeferredResult
1.6.2 Callable
java.util.concurrent.Callable
1.6.3 Processing
異步請求流的處理流程
- ServletRequest被放到異步模型中,通過使用
request.startAsync()
。這樣的好處是Servlet可以退出但是reponse後續在進程完成後返回 - 調用
request.startAsync()
返回AsyncContext
。可以用這個Context做一些對異步處理的控制。比圖提供dispatch
方法。 ServletRequest
提供對當前的
DispatcherType
的獲取方式,你可以用來初始化請求。
DeferredResult
- controller 返回DeferredResult,並把它保存在內存裏或者可以拿到的地方。
- Spring MVC calls request.startAsync()
- 同時 DispatcherServlet 和所有的配置的filters退出,但是response保留打開。
- 應用設置
DeferredResult
,然後MVC把request 返回分發到Servlet container。 DispatcherServlet
再次被調用處理異步返回的結果。
Callable processing works as follows
- controller返回
Callable
- MVC 調用
request.startAsync()
和提交Callable
到TaskExecutor
。 - 同時Servlet container thread中存在的
DispatcherServlet
和filters退出線程。 - 最終Callable被執行,mvc把結果寫到Servlet容器
DispatcherServlet
再次被調用
Exception Handling
異常的處理
When you use a DeferredResult
, you can choose whether to call setResult
or setErrorResult
。
異常處理和前面沒什麼區別。
Interception
HandlerInterceptor實例的類型可以爲AsyncHandlerInterceptor,以在啓動異步處理的初始請求(而不是postHandle和afterCompletion)上接收afterConcurrentHandlingStarted回調。
HandlerInterceptor實現也可以註冊CallableProcessingInterceptor或DeferredResultProcessingInterceptor,以與異步請求的生命週期更深入地集成(例如,處理超時事件)。 有關更多詳細信息,請參見AsyncHandlerInterceptor。
DeferredResult提供onTimeout(Runnable)和onCompletion(Runnable)回調。 有關更多詳細信息,請參見DeferredResult的javadoc。 可以用Callable代替WebAsyncTask,它公開了超時和完成回調的其他方法。
1.6.4 HTTP Streaming
使用DeferredResult
和 Callable
來做single 異常返回,但是如果有多個呢。
Objects
ResponseBodyEmitter
產生一個對象流,被
你可以用ResponseBodyEmitter
作爲ResponseEntity的body。
當emitter
發生IO異常時,應用不會調用emitter.complete or emitter.completeWithError。而是AsyncListener
會檢測到。Spring MVC 去做completeWithError
。
SSE
SseEmitter
是ResponseBodyEmitter的自理,提供對Server-Sent Events
的支持,符合W3C SSE規範。
Raw Data
有時直接使用OutputStream
很方便,比如文件下載。你可以使用StreamingResponseBody
。
1.6.5 Reactive Types
反應器類型。
1.6.6 Disconnects
斷開連接。無論使用SseEmitter
還是reactive types
,當Streaming週期性的發送數據時,都面臨client 斷開連接。send端會拿到空的SSE事件等,或者做心跳連接等。
這時可以考慮使用STOMP over WebSocket
等解決方案,他們內置了心跳連接機制。
1.6.7 配置
Servlet Container的配置
Filter和 ServletasyncSupported
設置爲true
去打開。額外,filter mapping打開ASYNC javax.servlet.DispatchType
。
java配置AbstractAnnotationConfigDispatcherServletInitializer
去處理。
等同於用web.xml配置添加
true
ASYNC