摘要:異步處理是指給這些阻塞操作分配一個新線程,并把關聯請求處理的線程返回給容器。異步處理支持和的異步處理。在一個上啟用異步處理,設置注解的參數為,如下類提供在方法中執行異步處理所需的功能。
應用服務器的web容器通常會為每個請求分配一個服務線程。在重負載的場景下,容器需要大量的線程去服務所有客戶端請求。服務可擴展性的限制包括內存不足或者耗盡容器線程。創建可擴展web程序,你必須確保沒有關聯請求的線程是空閑的,所以容器可以使用他們處理新請求。
這里有兩個關聯請求的線程空閑的兩個場景:
線程需要在構建響應之前等待一個資源可用或者處理數據。例如,一個應用程序需要在構建響應前查詢數據庫或者通過遠程web服務訪問數據。
線程需要在構建響應之前等待一個事件。例如,線程在構建響應之前需要等待一個JMS消息,另一個客戶端的新信息,或者隊列里面的新數據可用。
這些場景代表限制web程序可擴展性的阻塞操作。異步處理是指給這些阻塞操作分配一個新線程,并把關聯請求處理的線程返回給web容器。
servlet 異步處理java ee支持servlet和filter的異步處理。如果一個servlet或一個filter處理請求時可能到達一個阻塞操作,它可以把操作分配給一個異步處理上下文并且在不生成響應的情況下將關聯請求處理的線程回送給web容器。阻塞操作在不同線程的異步上下文中執行完成,它可以生成響應或者轉發請求到另一個servlet。
在一個servlet上啟用異步處理,設置@WebServlet注解的asyncSupported參數為true,如下:
@WebServlet(urlPatterns={"/asyncservlet"}, asyncSupported=true) public class AsyncServlet extends HttpServlet { ... }
javax.servlet.AsyncContext類提供在Service方法中執行異步處理所需的功能。獲得一個AsyncContext實例,在service方法中調用request對象的startAsync()方法;例如:
public void doGet(HttpServletRequest req, HttpServletResponse resp) { ... AsyncContext acontext = req.startAsync(); ... }
這個調用將請求進入異步模式并且確保響應在退出service方法時每月被提交。你必須在異步上下文完成阻塞操作時生成響應或者轉發到其他servlet中。
AsyncContext類提供的基礎功能描述:
方法簽名:void start(Runnable run)
描述:容器提供的能提供阻塞操作處理的不同線程
方法簽名:ServletRequest getRequest()
描述:返回用來初始化異步上下文的請求。在上面的例子中,request與service方法中的相同。你可以通過這個方法在異步上下文中從請求中獲取參數。
方法簽名:ServletResponse getResponse()
描述:返回初始化異步上下文的響應。在上面的例子中,response與service方法中的相同。你可以在異步上下文中,使用這個方法寫入阻塞操作的結果到響應中。
方法簽名:void complete()
描述:完成異步操作,并關閉與此異步上下文關聯的響應。你可以在異步上下文完成寫入響應后調用這個操作。
方法簽名:void dispatch(String path)
描述:轉發請求和響應到給定的路徑。在阻塞操作完成后,使用這個方法調用另一個servlet寫出響應。
這個章節示范了怎么使用AsyncContext上下文提供的功能,有如下用例:
servlet從一個GET請求中獲取參數
servlet使用一個資源,比如一個數據庫或者一個web service,基于這個參數獲取信息。這個資源可能比較緩慢,所以這可能是一個阻塞操作。
servlet使用資源的結果生成響應。
下面的例子是一個不使用異步處理的常見servlet:
@WebServlet(urlPatterns={"/syncservlet"}) public class SyncServlet extends HttpServlet { private MyRemoteResource resource; @Override public void init(ServletConfig config) { resource = MyRemoteResource.create("config1=x,config2=y"); } @Override public void doGet(HttpServletRequest request, HttpServletResponse response) { response.setContentType("text/html;charset=UTF-8"); String param = request.getParameter("param"); String result = resource.process(param); /* ... print to the response ... */ } }
下面的示例是同一個servlet,但使用了異步處理:
@WebServlet(urlPatterns={"/asyncservlet"}, asyncSupported=true) public class AsyncServlet extends HttpServlet { /* ... Same variables and init method as in SyncServlet ... */ @Override public void doGet(HttpServletRequest request, HttpServletResponse response) { response.setContentType("text/html;charset=UTF-8"); final AsyncContext acontext = request.startAsync(); acontext.start(new Runnable() { public void run() { String param = acontext.getRequest().getParameter("param"); String result = resource.process(param); HttpServletResponse response = acontext.getResponse(); /* ... print to the response ... */ acontext.complete(); } }
AsyncServlet在@WebServlet注解屬性中添加asyncSupported=true。其余的差異在service方法中:
request.startAsync() 引發request被異步執行;response不會在service方法結束時發送到客戶端;
acontext.start(new Runnable() {...})從容器中得到一個新的線程。
內部類中的run() 中的代碼在一個新線程中執行。內部類需要從異步上下文中讀取請求參數和寫入響應。調用異步上下文的complete()方法來提交并發送響應到客戶端。
AsyncServlet的service方法立即返回,同時請求在異步上下文中處理。
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/74257.html
摘要:調用棧被清空,消息隊列中并無任務,線程停止,事件循環結束。不確定的時間點請求返回,將設定好的回調函數放入消息隊列。調用棧執行完畢執行消息隊列任務。請求并發回調函數執行順序無法確定。 異步編程 JavaScript中異步編程問題可以說是基礎中的重點,也是比較難理解的地方。首先要弄懂的是什么叫異步? 我們的代碼在執行的時候是從上到下按順序執行,一段代碼執行了之后才會執行下一段代碼,這種方式...
摘要:本部分示例見這個項目的分支下的中引進了基于異步請求處理的。同時主容器線程退出釋放并允許處理其他請求。對的調用返回,可以被用于異步處理之上的進一步控制。 ??本部分示例見這個項目的 mvc 分支下的 AsyncController.java ??Spring MVC 3.2 中引進了基于異步請求處理的 Servlet 3。除了返回一個值,一個控制器方法現在可以返回一個java.util...
摘要:概述本篇主要介紹的運行機制單線程事件循環結論先在中利用運行至完成和非阻塞完成單線程下異步任務的處理就是先處理主模塊主線程上的同步任務再處理異步任務異步任務使用事件循環機制完成調度涉及的內容有單線程事件循環同步執行異步執行定時器的事件循環開始 1.概述 本篇主要介紹JavaScript的運行機制:單線程事件循環(Event Loop). 結論先: 在JavaScript中, 利用運行至...
摘要:微信官方沒有給出來處理異步操作,而官方異步的又非常多,這使得多異步編程會層層回調,代碼一復雜,回調起來就想砸電腦。是一個轉換微信小程序異步為的一個工具庫優點避免小程序異步編程多次回調帶來的過多回調導致邏輯不清晰,篇幅過長等問題。 把微信小程序異步API轉化為Promise。用Promise處理異步操作有多方便,誰用誰知道。微信官方沒有給出Promise API來處理異步操作,而官方AP...
閱讀 854·2023-04-26 00:11
閱讀 2655·2021-11-04 16:13
閱讀 2101·2021-09-09 09:33
閱讀 1472·2021-08-20 09:35
閱讀 3818·2021-08-09 13:42
閱讀 3605·2019-08-30 15:55
閱讀 1040·2019-08-30 15:55
閱讀 2218·2019-08-30 13:55