b spring mvc 之 Endpoints 服務端配置 & 異步請求

–> go to 總目錄

1.4 function Endpoints

輕量的Spring mvc,類似requestmapping。

1.5 URI Links

Work with URI Links
後期再瞭解。

1.6 異步請求

MVC集成和擴展了Servlet 3.0的異步請求處理

  • controller方法返回DeferredResultCallable提供單個方法的異步支持。

  • Controllers can stream multiple values, including SSE and raw data.

  • Controllers can use reactive clients and return 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()和提交CallableTaskExecutor
  • 同時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

使用DeferredResultCallable來做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

Spring MVC

在這裏插入圖片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章