Java EE重新審視設計模式:異步

盡管您可能找不到作為設計模式列出的異步方法調用,但我還是值得一提。 因此,這是我的JavaEE Revisits設計模式系列的最后一篇文章。

異步方法調用只不過是多線程。 基本上,它是指將在單獨的線程中運行的方法調用,因此主(調用方)線程無需等待被調用方法的執行結果。 在Web編程時代,開發人員通常將線程問題委托給正在運行的服務器,并且在Web服務器上創建新線程可能很棘手,有時甚至很危險,因為他們通常喜歡自己管理線程。

但是,使用JavaEE在使用線程的同時與服務器配合使用非常簡單。 用@Asynchronous注釋方法就足以告訴JavaEE容器在單獨的線程中異步運行被調用的方法。 為了測試異步執行,讓我們在前面的示例中添加一個標有“異步”注釋的新方法。

package com.devchronicles.observer;import javax.ejb.Asynchronous;
import javax.ejb.Stateless;
import javax.enterprise.event.Observes;/**** @author Murat Yener*/
@Stateless
public class EventObserver {@Asynchronouspublic void doLogging(@Observes String log) {System.out.println("1.Start logging:"+log);try{Thread.sleep(3000);}catch (InterruptedException e){}System.out.println("1.done logging");}public void doLogging2(@Observes String log) {System.out.println("2.Start logging:"+log);try{Thread.sleep(3000);}catch (InterruptedException e){}System.out.println("2.done logging");} 
}

除了用于記錄的幾行外,EventService類保持不變。

package com.devchronicles.observer;import javax.ejb.Stateless;
import javax.ejb.TransactionAttribute;
import javax.ejb.TransactionAttributeType;
import javax.enterprise.event.Event;
import javax.inject.Inject;/**** @author Murat Yener*/
@Stateless
@TransactionAttribute(TransactionAttributeType.REQUIRED)
public class EventService {@Injectprivate String message;@Inject Event<string> event;public void startService(){System.out.println("start service call "+message);event.fire("this is my "+message);System.out.println("done...");}
}

運行該應用程序,然后單擊index.xhtml上的按鈕,這將啟動startService方法。 日志文件應類似于以下文件。

INFO: Observer was successfully deployed in 553 milliseconds.
INFO: start service call A message!!
INFO: 2.Start logging:this is my A message!!
INFO: 2.done logging
INFO: done...
INFO: 1.Start logging:this is my A message!!
INFO: 1.done logging

盡管日志可能有所不同,但是您仍然應該清楚地看到調用了startService方法,該方法會觸發事件,然后執行第二個日志記錄方法。 startService方法等待,直到第二個日志方法的執行完成。 但是,第一個日志記錄方法的開始和結束獨立于其他方法的執行。

盡管此示例基于void方法,但使用Future <>作為返回類型并異步接收結果非常簡單。

異步注釋非常易于使用,并且在您不想等待被調用方法執行的情況下非常有用。

參考: JavaEE重新審視了設計模式: 開發人員紀事博客上來自我們JCG合作伙伴 Murat Yener的異步消息 。


翻譯自: https://www.javacodegeeks.com/2012/04/java-ee-revisits-design-patterns.html

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

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

相關文章

am335x watchdog

am335x watchdog 內核文檔kernel/Documentation/watchdog Qtaplex:~/kernel/7109/linux-3.2.0/Documentation/watchdog$ ll total 88 drwxrwxr-x 3 Qt Qt 4096 Jun 8 15:11 ./ drwxrwxr-x 94 Qt Qt 12288 Apr 28 13:09 ../ -rwxrwxr-x 1 Qt Qt 576 Nov 20 2013 00-INDEX -rwxrw…

springboot2 使用hikaridatasource 并測試_基于Spring Boot 2.x的后端管理網站腳手,源碼免費分享...

基于Spring Boot 2.x 的 Material Design 的后端管理網站腳手架 &#xff1a;提供權限認證 用戶管理 菜單管理 操作日志 等常用功能去繁就簡 重新出發基于Spring Boot 集成一些常用的功能&#xff0c;你只需要基于它做些簡單的修改即可。功能列表&#xff1a;權限認證權限管理用…

測試驅動開發–雙贏策略

敏捷從業人員談論測試驅動開發 &#xff08;TDD&#xff09;&#xff0c;所以許多關心代碼質量和可操作性的開發人員也是如此。 我曾幾何時&#xff0c;不久前設法閱讀了有關TDD的文章。 據我了解&#xff0c;TDD的關鍵是&#xff1a; 編寫測試&#xff0c;但失敗 代碼&#x…

設計模式學習(三)——裝飾器模式

前言 距離上一次正兒八經地寫隨筆已經有一段時間了&#xff0c;雖然2月10號有一篇關于泛型的小記&#xff0c;但是其實只是簡單地將自己的學習代碼貼上來&#xff0c;為了方便后續使用時查閱&#xff0c;并沒有多少文字和理解感悟。之所以在今天覺得有必要寫點東西&#xff0c;…

swift - 導航欄設置

話不多&#xff0c;直接貼代碼&#xff1a; let nav UINavigationController.init(rootViewController: viewController) nav.topViewController?.title title// 設置導航欄的標題 nav.navigationBar.tintColor .whiteColor()// 設置push出的導航欄的返回顏色(箭頭及文字) …

mysql5.6主從復制(讀寫分離)方案_MySQL5.6主從復制(讀寫分離)方案

MySQL5.6主從復制(讀寫分離)方案一、前言&#xff1a;為什么MySQL要做主從復制(讀寫分離)&#xff1f;通俗來講&#xff0c;如果對數據庫的讀和寫都在同一個數據庫服務器中操作&#xff0c;業務系統性能會降低。為了提升業務系統性能&#xff0c;優化用戶體驗&#xff0c;可以通…

在實踐中使用延遲隊列

通常&#xff0c;在某些情況下&#xff0c;當您有某種工作或作業隊列時&#xff0c;有必要不立即處理每個工作項或作業&#xff0c;而是要延遲一些時間。 例如&#xff0c;如果用戶單擊一個按鈕來觸發要完成的某項工作&#xff0c;而一秒鐘后&#xff0c;用戶意識到他/她錯了&a…

PCL學習八叉樹

建立空間索引在點云數據處理中有著廣泛的應用&#xff0c;常見的空間索引一般 是自頂而下逐級劃分空間的各種空間索引結構&#xff0c;比較有代表性的包括BSP樹&#xff0c;KD樹&#xff0c;KDB樹&#xff0c;R樹&#xff0c;四叉樹&#xff0c;八叉樹等索引結構&#xff0c;而…

Android實現自定義帶文字和圖片的Button

在Android開發中經常會需要用到帶文字和圖片的button&#xff0c;下面來講解一下常用的實現辦法。 一.用系統自帶的Button實現 最簡單的一種辦法就是利用系統自帶的Button來實現&#xff0c;這種方式代碼量最小。在Button的屬性中有一個是drawableLeft&#xff0c;這個 屬性可以…

mysql語句中的注釋方法_MySQL語句注釋方式簡介

MySQL支持三種注釋方式&#xff1a;1.從‘#字符從行尾。2.從‘-- 序列到行尾。請注意‘-- (雙破折號)注釋風格要求第2個破折號后面至少跟一個空格符(例如空格、tab、換行符等等)。3.從/*序列到后面的*/序列。結束序列不一定在同一行中&#xff0c;因此該語法允許注釋跨越多行。…

aqlserver實用程序_sqlserver命令提示實用工具的介紹

除上述的圖形化管理工具外&#xff0c;SQL Server2008還提供了大量的命令行實用工具&#xff0c;包括bcp、dtexec、dtutil、osql、reconfig、sqlcmd、sqlwb和tablediff等&#xff0c;下面進行簡要說明。dtexec實用工具用于配置和執行SQL Server2008 Intgration Services包。用戶…

使用Java和Scala將Play Framework 2應用程序部署到Openshift

幾個星期&#xff0c; 馬克阿特伍德 &#xff08; Mark Atwood&#xff09; &#xff0c; 豪爾赫阿里斯 &#xff08; Jorge Aliss &#xff09;和我塞巴斯蒂安 斯卡塔諾 &#xff08; SebastinScarano&#xff09;參加了紅帽網絡研討會LETS PLAY&#xff01; 在云端&#xff1…

LintCode 387: Smallest Difference

LintCode 387: Smallest Difference 題目描述 給定兩個整數數組&#xff08;第一個是數組A&#xff0c;第二個是數組B&#xff09;&#xff0c;在數組A中取A[i]&#xff0c;數組B中取B[j]&#xff0c;A[i]和B[j]兩者的差越小越好(|A[i] - B[j]|)。返回最小差。 樣例 給定數組A …

android框架----下沉文字Titanic的使用

Titanic is a simple illusion obtained by applying an animated translation on the TextView TextPaint Shaders matrix. Titanic的使用 Titanic的使用&#xff0c;項目結構如下&#xff1a; 一、下載Titanic并且部署到項目中 Titanic的項目地址&#xff1a; https://github…

linux 自動安裝mysql_Linux安裝mysql

一、下載這里我創建了一目錄software用于存放我們待會要下載的mysql包&#xff0c;先去到該目錄命令&#xff1a;cd /software命令&#xff1a;wget http://mirrors.sohu.com/mysql/MySQL-5.7/mysql-5.7.17-linux-glibc2.5-x86_64.tar下載完成后&#xff0c;你會在software這個…

Quartz Scheduler插件–隱藏的寶藏

盡管在官方文檔中進行了簡要描述&#xff0c;但我相信Quartz插件了解得還不夠多&#xff0c;看看它們有多有用。 本質上&#xff0c;Quartz中的插件是方便的類&#xff0c;用于包裝基礎偵聽器的注冊。 您可以自由編寫自己的插件&#xff0c;但我們將專注于Quartz隨附的現有插件…

mysql查詢表名匹配只有字母的_MySQL按某些匹配字母查詢表

MySQL查詢是MySQL的核心功能&#xff0c;有時候我們需要查找帶有某些匹配字母的表。下文對該MySQL查詢方式作了詳細的介紹&#xff0c;供您參考。在MySQL中我們可以使用LIKE或者NOT LIKE操作符進行比較。在MySQL中模式默認是不區分大小寫的。查詢示例&#xff0c;student表----…

hdu 1181(Floyed)

變形課 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 131072/65536 K (Java/Others)Total Submission(s): 20748 Accepted Submission(s): 7494 Problem Description呃......變形課上Harry碰到了一點小麻煩,因為他并不像Hermione那樣能夠記住所有的咒語而隨意的…

讀書筆記-你不知道的JS上-混入與原型

繼承 mixin混合繼承 function mixin(obj1, obj2) {for (var key in obj2) {//重復不復制if (!(key in obj1)) {obj1[key] obj2[key];}}return obj1;} 這種復制是淺復制&#xff0c;對象或者數組函數等都是同一個引用&#xff0c;改變obj1的會同時影響obj2。 寄生繼承 ... 隱式…

JUnit和Hamcrest:在assertEquals上進行改進

在我的博客文章中&#xff0c;Java越來越接受靜態導入嗎&#xff1f; &#xff0c;我討論了在Java中越來越多地使用靜態導入來使代碼在某些情況下更流暢。 Java 單元測試特別受靜態導入的影響&#xff0c;在此博客文章中&#xff0c;我提供了一個簡單的示例&#xff0c;說明如何…