摘要:本部分示例見這個項目的分支下的中引進了基于異步請求處理的。同時主容器線程退出釋放并允許處理其他請求。對的調用返回,可以被用于異步處理之上的進一步控制。
??本部分示例見這個項目的 mvc 分支下的 AsyncController.java
??Spring MVC 3.2 中引進了基于異步請求處理的 Servlet 3。除了返回一個值,一個控制器方法現在可以返回一個java.util.concurrent.Callable并生產來自 Spring MVC 管理的線程的返回值。同時主 Servlet 容器線程退出、釋放并允許處理其他請求。Spring MVC 在 TaskExecutor 的幫助下,在一個獨立的線程中調用 Callable,當 Callable 返回時,請求被發回 Servlet 容器,使用 Callable 的返回值繼續執行。這里有一個這樣的控制器方法的例子:
@PostMapping public CallableprocessUpload(final MultipartFile file) { return new Callable () { public String call() throws Exception { // ... return "someView"; } }; }
??這個控制器方法的另一個選擇是返回一個DeferredResult實例。這種情況下,返回值可以由任何線程產生,比如一個沒有被 Spring MVC 管理的線程。比如,結果可能產生于外部事件的響應,比如一個 JMS 消息,一個定時任務等。這里有一個這樣的控制器方法的例子:
@RequestMapping("/quotes") @ResponseBody public DeferredResultquotes() { DeferredResult deferredResult = new DeferredResult (); // Save the deferredResult somewhere.. return deferredResult; } // In some other thread... deferredResult.setResult(data);
??如果沒有任何對 Servlet 3.0 中異步請求處理特性的了解的話,這可能很難理解。去了解一下會很有幫助。這里列出幾個這個機制的基本事實:
通過request.startAsync()調用,一個 ServletRequest 可以被置為異步模式。這么做的主要影響是,Servlet,以及任何 Filter,可以退出,但是響應依舊會保持開放來允許之后完成處理過程。
對request.startAsync()的調用返回 AsyncContext,AsyncContext 可以被用于異步處理之上的進一步控制。比如它提供了方法調度功能,這很像 Servlet API 中的 forward,但是它允許應用程序繼續在 Servlet 容器線程中進行請求處理。
ServletRequest 提供對當前 DispatcherType 的訪問,DispatcherType 可以用于區別處理初始化請求、異步調度、forward 和其他調度器(dispatcher)類型。
??有了上面的意識,下面是用于帶有 Callable 的異步請求處理的事件序列:
控制器返回一個 Callable
Spring MVC 開始異步處理,并把 Callable 提交給一個 TaskExecutor 用于在一個多帶帶的線程中處理
DispatcherServlet 和所有的 Filter 退出 Servlet 容器線程,但是響應保持打開
這個 Callable 產生一個結果,Spring MVC 把這個請求調回 Servlet 容器繼續處理
DispatcherServlet 繼續執行,并繼續處理來自 Callable 的異步產生的結果
??DeferredResult 的事件序列很相似,除了它應該由應用程序從任何線程中來產生異步結果:
控制器返回一個 DeferredResult,并把它保存在內存中的隊列或者列表中用于訪問
Spring MVC 開始異步處理
DispatcherServlet 和所有配置的 Filter 退出請求處理線程,但是響應依舊打開
應用程序設置來自一些線程中的 DeferredResult,Spring MVC 把請求調回 Servlet 容器
DispatcherServlet 再次被調用,并繼續處理異步產生的結果
??要了解更多使用異步請求處理的動機的背景,以及什么時候或為什么使用它,請讀這個博客文章系列.
因為所學有限,這一部分并沒有真正完成。這里先占坑,日后再行補充。
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/66082.html
摘要:本文章是藍圖系列的第一篇教程。是事件驅動的,同時也是非阻塞的。是一組負責分發和處理事件的線程。注意,我們絕對不能去阻塞線程,否則事件的處理過程會被阻塞,我們的應用就失去了響應能力。每個負責處理請求并且寫入回應結果。 本文章是 Vert.x 藍圖系列 的第一篇教程。全系列: Vert.x Blueprint 系列教程(一) | 待辦事項服務開發教程 Vert.x Blueprint 系...
摘要:也就是說不應該有公開的,所有都應該是私有的,只能有公開的。允許使用方法設置監聽函數,一旦發生變化,就自動執行這個函數。用一個叫做的純函數來處理事件。可以通過得到當前狀態。在中,同步的表現就是發出以后,立即算出。 這篇文章試著聊明白這一堆看起來挺復雜的東西。在聊之前,大家要始終記得一句話:一切前端概念,都是紙老虎。 不管是Vue,還是 React,都需要管理狀態(state),比如組件之...
摘要:中所有的基礎類型類等都繼承,默認值是,自帶和,而如果是或者的話,那么它只有一個方法。斷言失敗則程序立刻終止檢查是否為空字符串檢查是否小于等于檢查是否為檢查是否為字符串中,支持類型。類繼承類,通過關鍵字調用類的構造函數。泛型全面支持泛型。 目錄介紹 01.變量聲明 1.1 var聲明變量 1.2 變量和常量 1.3 dynamic和Object 02.數據類型 2.1 基本...
摘要:摘要的錯誤監控插件同步支持異步錯誤監控。此次更新,我們對的監控插件做了相應的更新,來更好地支持使用框架開發的應用錯誤的監控。程序運行后,成功捕獲該錯誤總結更新到,對錯誤處理提供了更加強大的支持。 摘要: Fundebug 的 JavaScript 錯誤監控插件同步支持 Vue.js 異步錯誤監控。 Vue.js 從誕生至今已經 5 年,尤大在今年 2 月份發布了重大更新,即Vue 2....
閱讀 2261·2021-10-09 09:41
閱讀 3409·2021-09-13 10:34
閱讀 1920·2019-08-30 12:59
閱讀 557·2019-08-29 17:27
閱讀 1063·2019-08-29 16:07
閱讀 2956·2019-08-29 13:15
閱讀 1306·2019-08-29 13:14
閱讀 1562·2019-08-26 12:18