在Grails 2.0中使用Servlet 3.0異步功能

上周,我與某人談論了Grails 2中對Servlet 3.0異步功能的新支持,并意識到我對可用功能并不了解。 所以我想我會嘗試一下并分享一些例子。 該文檔對這個主題有些了解,因此首先介紹一些背景信息。
在3.0規范中進行異步工作的主要方式是javax.servlet.ServletRequest類中的新startAsync方法。 這將返回javax.servlet.AsyncContext接口的實例,該實例具有生命周期方法(例如dispatchcomplete ,為您提供了對請求和響應的掛鉤,并允許您注冊javax.servlet.AsyncListener 。 您調用傳入Runnablestart方法來執行異步工作。 使用這種方法可以釋放服務器資源而不是進行阻塞,這可以提高可伸縮性,因為您可以處理更多的并發請求。
為了使用此功能,處理請求的servlet必須支持異步,并且過濾器鏈中所有應用的過濾器也必須支持。 主Grails Servlet( GrailsDispatcherServlet )在web.xml模板的3.0版本中注冊,并且async-supported屬性設置為true。 Servlet3AsyncWebXmlProcessor生成后,將<async-supported>true</async-supported>到web.xml中的所有過濾器聲明中。 這樣就為您覆蓋了; 您沒有必需的web.xml配置。
您還必須配置為使用Servlet API 3.0。 這很容易做到; 只需將grails.servlet.version的值grails.servlet.version為“ 3.0? 默認值“ 2.5”。 請注意,application.properties中有一個舊設置,名稱為app.servlet.version ; 您應該從application.properties文件中刪除此行,因為它的值在運行時會被BuildConfig.groovy中的值忽略并覆蓋。
但是,您不會在控制器的請求上調用startAsync ; 直接在控制器上調用startAsync 。 此方法是作為控制器方法添加的(作為Controller的AST轉換的一部分,從ControllersAsyncApi連接 (如果您感到好奇,可以通過ControllerAsyncTransformer連接 ))。 調用控制器的startAsync方法非常重要,因為它可以執行所有標準工作,而且還可以添加Grails集成。 這包括添加邏輯以集成所有已注冊的PersistenceContextInterceptor實例,例如將Hibernate Session綁定到線程,完成后刷新等,并與Sitemesh集成。 這是通過返回的實例來實現的
GrailsAsyncContext為其余部分添加額外的行為并委托給容器提供的實際實例(例如Tomcat中的org.apache.catalina.core.AsyncContextImpl )。
請求中還有其他一些與異步相關的新方法。 它們包括boolean isAsyncStarted()AsyncContext getAsyncContext()
我已經附加了一個示例應用程序(請參閱下面的鏈接)以演示這些功能。 有兩個部分: 一個異步查詢股票價格的簡單控制器,以及一個聊天應用程序。
StockController非常簡單。 它只有一個動作,因此會暫停以查詢所請求的股票報價器的當前股價。 它異步執行此操作,但通常速度非常快,因此您可能看不到與串行方法的真正區別。 但是,這種模式可以推廣到執行更多耗時的任務。
調用http:// localhost:8080 / asynctest / stock / GOOG,http:// localhost:8080 / asynctest / stock / AAPL,http:// localhost:8080 / asynctest / stock / VMW等進行測試。
第二個示例涉及更多,并基于Java EE 6 SDK中的“ async-request-war”示例。 這實現了一個聊天應用程序(它以前是通過Comet實現的)。 SDK的示例是一個大servlet。 我將其拆分為一個控制器以執行標準請求工作,并將其ChatManagerChatManager類(在resources.groovy中注冊為Spring Bean)來處理客戶端注冊,消息排隊和調度以及相關的錯誤處理。
該實現使用隱藏的iframe來啟動長時間運行的請求。 它永遠不會完成,并且用于將消息發送回每個注冊的客戶端。 當您“登錄”或發送消息時,控制器將處理請求并將響應消息排隊。 然后, ChatManager循環遍歷每個已注冊的AsyncContext ,并將JSONP發送到iframe,該iframe使用傳入消息更新主頁中的文本區域。
使我困擾了很長時間的一件事是,該示例在SDK示例中運行良好,但在我的示例中卻無法運行。 一切看起來不錯,但iframe并未收到消息。 事實證明,這是由于進行了適當的優化以使響應呈現盡可能快。 不幸的是,這導致響應編寫器上的flush()調用被忽略。 由于我們需要響應式更新,并且不會呈現較大的html頁面,因此我添加了代碼來查找由Grails代碼包裝的真實響應,并直接發送給它。
在兩個瀏覽器中打開http:// localhost:8080 / asynctest /嘗試一下。 一旦您“登錄”到兩者,發送的消息將在兩個瀏覽器中顯示。
有關測試應用程序的一些注意事項:
  • 所有客戶端邏輯都在web-app / js / chat.js中
  • grails-app / views / chat / index.gsp是主頁; 它創建了文本區域來顯示消息,而隱藏的iframe保持連接狀態并收聽消息
  • 這需要實現3.0規范的Servlet容器。 由tomcat插件提供并由run-app使用的Tomcat版本,而所有7.x版本的Tomcat都有。
  • 我運行install-templates并編輯了web.xml以添加metadata-complete="true"以防止Tomcat掃描所有jar文件中的帶注釋的類–由于版本7.0.26中修復的錯誤(當前未發布 ,因此這可能導致OOME)
  • 由于聊天部分基于舊代碼,因此它使用Prototype,但可以輕松使用jQuery。

您可以在此處下載示例應用程序代碼。

參考: An Solipsists博客上的JCG合作伙伴 Burt Beckwith 提供的在Grails 2.0中使用Servlet 3.0異步功能 。


翻譯自: https://www.javacodegeeks.com/2012/06/using-servlet-30-async-features-in.html

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/372450.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/372450.shtml
英文地址,請注明出處:http://en.pswp.cn/news/372450.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

接口怎么實例化?

最開始看到數據庫連接的時候忽然想到這個問題&#xff1a; Connection connull;try {Class.forName(Driver);} catch (ClassNotFoundException e) {e.printStackTrace();}try {conDriverManager.getConnection(url, user, pass);} catch (SQLException e) {e.printStackTrace()…

css中基線指的是哪一條線,如何設置基線網絡_CSS, Vertical Rhythm 教程_W3cplus

首先&#xff0c;當談到排版&#xff0c;我們先要了解基線是什么&#xff1f;維基百科是這樣定義)的&#xff1a;在排版和書法中&#xff0c;基線是以字終sit底線為基礎&#xff0c;并且向兩邊延伸的直線。好極了&#xff0c;但我為什么要忽視他呢&#xff1f;好希望你充滿激情…

libvirt里的面向對象的C語言

C語言&#xff1a;類的聲明和定義 1 // 通用父類的定義2 struct _virClass {3 virClassPtr parent;4 5 unsigned int magic;6 char *name;7 size_t objectSize;8 9 virObjectDisposeCallback dispose; 10 }; 11 typedef struct _virClass virClass; 12 typ…

使用JGroups進行ElasticMQ消息復制

ElasticMQ是一臺消息服務器&#xff0c;具有Scala&#xff0c;Java和與Amazon SQS兼容的接口。 它通過跨服務器群集復制消息來支持有保證的消息傳遞&#xff0c;并通過日志記錄實現消息持久性。 消息復制是ElasticMQ的核心功能之一。 但是&#xff0c;如果您看一下代碼&#xf…

ajax省市二級聯動硬編碼,AJAX請求接受硬編碼的JSON,但不接受軟編碼

這個AJAX請求返回&#xff06;&#xff03;39;成功&#xff06;&#xff03;39;如果PHP中的輸出被復制并粘貼了JSON&#xff0c;但是&#xff06;&#xff03;39;失敗&#xff06;&#xff03;39;如果它是由文件生成的。看看下面api.php中的評論&#xff0c;看看我的意思。$.aj…

Fiddler高級技巧 - 映射路徑到本地文件夾

適用場景&#xff1a; 你是前端開發人員&#xff0c;要開發一個小模塊&#xff0c;需要用到線上的環境&#xff08;賬號、數據、跨域等&#xff09;&#xff0c;但你又沒有權限往線上傳文件你是移動測試人員&#xff0c;需要將一組接口的返回結果替換為另一組&#xff0c;最簡單…

Spring Social入門

像我一樣&#xff0c;無論是添加簡單的Facebook“贊”按鈕&#xff0c;一大堆“共享”按鈕還是顯示時間軸信息&#xff0c;您都不會注意到當前對應用程序“社交化”的熱衷。 每個人都在做這件事&#xff0c;包括Spring的家伙&#xff0c;事實上&#xff0c;他們提供了一個稱為S…

apache ajax 跨域訪問,Apache 實現AJAX跨域請求

當使用ajax跨域請求時&#xff0c;瀏覽器報錯&#xff1a;XmlHttpRequest error: Origin null is not allowed by Access-Control-Allow-Origin.肯定是跨域的問題&#xff0c;如果用jsonp或者pro更多&#xff1a;當使用ajax跨域請求時&#xff0c;瀏覽器報錯&#xff1a;XmlHtt…

14、數據庫

數據庫轉載于:https://www.cnblogs.com/quyong/p/6687924.html

EhCache復制:RMI與JGroups

最近&#xff0c;我正在研究一種需要復制緩存的產品。 緩存提供程序已經確定-EhCache&#xff0c;剩下的就是有關傳輸的問題。 哪一個是最佳選擇&#xff1f; 這里的最佳選擇是指性能更好的選擇。 僅在兩個可用傳輸之間進行了性能評估-JGroups和RMI&#xff0c;對其他傳輸不予考…

Oracle 監控語句整理(包括TOP SQL等)

希望能對大家有所幫助&#xff01; 很多時候大家想查看oracle數據庫中的sql語句執行情況&#xff0c;但是又不知道如何是好&#xff0c;今天在這里為大家提供一個sql語句&#xff0c;大家可以通過以下的sql語句查詢Oracle數據庫中Top Sql情況&#xff1a; 查詢結果可按照PCT、總…

服務器wifi無線放大器,一回家WiFi信號太弱?教你用兩毛錢制作信號放大器

原標題&#xff1a;一回家WiFi信號太弱&#xff1f;教你用兩毛錢制作信號放大器現在家家戶戶都有無線路由器&#xff0c;但是大部分人都還是早期的單天線產品&#xff0c;信號覆蓋范圍比較小&#xff0c;特別是穿墻性能不行。人在客廳WiFi信號還滿格&#xff0c;一到臥室就瞬間…

iOS開發 之 可穿戴設備 藍牙4.0 BLE 開發

1 前言 當前有越來越多的可穿戴設備使用了藍牙4.0 BLE&#xff08;Bluetooth Low Energy)。對于iOS開發而言&#xff0c;Apple之前專門推出CoreBluetooth的Framework來支持BLE的開發。對于硬件開發有了解的朋友應該知道&#xff0c;在之前使用低版本的藍牙的設備&#xff0c;要…

將Java服務公開為Web服務

本教程解決了開發人員面臨的最實際的情況。 大多數時候&#xff0c;我們可能需要將某些現有服務公開為Web服務。 在項目生命周期的不同階段可能會遇到這種情況。 如果這是初始階段&#xff0c;那么您幾乎是安全的&#xff0c;您可以為此做好充分的準備。 但是&#xff0c;將要發…

git服務器維護 備份,gitlab服務運維,備份與恢復 - 橙子檸檬's Blog

gitlab服務運維工作Gitlab-ctl 使用gitlab-ctl start #啟動服務gitlab-ctl stop #停止服務gitlab-ctl restart #重啟服務檢查服務的日志信息gitlab-ctl tail redis #檢查redis的日志gitlab-ctl tail postgresql #…

angular js實現開關效果

功能&#xff1a;實現點擊排序&#xff0c;再點擊排倒序。 實現方法如下 方法一&#xff1a;定義變量實現點擊切換true或false&#xff0c;代碼為&#xff1a; $scope.lidata [ {"name":"Terry","age":12}, {&qu…

使用TestNG的彈簧測試支持

TestNG是一個測試框架&#xff0c;旨在涵蓋所有類別的測試&#xff1a;單元&#xff0c;功能&#xff0c;端到端&#xff0c;集成等。 它包括許多功能&#xff0c;例如靈活的測試配置&#xff0c;對數據驅動測試的支持&#xff08;使用DataProvider&#xff09;&#xff0c;強大…

Entity Framework - 理清關系 - 基于外鍵關聯的單向一對一關系

注&#xff1a;本文針對的是 Entity Framework Code First 場景。 之前寫過三篇文章試圖理清Entity Framework中的一對一關系&#xff08;單相思&#xff08;單向一對一&#xff09;, 兩情相悅&#xff08;雙向一對一&#xff09;, 兩情相悅-續&#xff09;&#xff0c;但當時理…

微信社交小程序服務器,Day12-微信小程序實戰-交友小程序-搭建服務器與上傳文件到后端...

要搞一個小型的cms內容發布系統因為小程序上線之后&#xff0c;直接對數據庫進行操作的話&#xff0c;慧出問題的&#xff0c;所以一般都會做一個管理系統&#xff0c;讓工作人員通過這個管理系統來對這個數據庫進行增刪改查微信小程序其實給我們提供了這樣的能力了(也就是可以…

java go

熟練掌握java技術&#xff0c;對多線程、數據結構有清晰的認識&#xff1b; 熟悉MySQL/Oracle數據庫&#xff0c;熟悉關系數據庫應用設計開發&#xff1b; 熟悉Spring/MyBatis/Freemarker等一種或者多種框架&#xff1b; java基礎扎實&#xff0c;熟練掌握目前主流的開源框架&a…