国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 學院 > 開發設計 > 正文

使用消息驅動Beans(2)

2019-11-18 12:28:42
字體:
來源:轉載
供稿:網友

  例子程序介紹
  我們的Email應用程序將使用PTP域模型。當一個eamil被放入隊列中時我們只希望一個接收者能夠收到,另外email可以被多次發送。
  JMS 消息被放入隊列的條目是JMS消息。這是一個普通的消息,他擁有消息頭和消息體。JMS消息有如下幾個類型:
  類型描述
  TextMessage文本消息. 你可以通過msg.setText("foo")和msg.getText方法來操作TextMessageObjectMessage
  這種消息存儲序列化對象。你可以通過msg.setObject(Object o)和msg.getObject()來操作ObjectMessage.MapMessage
  這種消息保存鍵/值對信息。你可以通過msg.setString(key,value)和msg.getString(key)來操作MapMessage.他還有其他幾種getter和setter方法對應基本java類型(比如,getBoolean,getInt,getObject,等等)BytesMessage這種消息是一個字節流。他可被用于封裝現有的消息格式。StreamMessage這種消息答應你發送java的原語流。在我們的例子中將使用一個MapMessage,因為他提供了一種方法可以讓我們把email的標題信息和內容信息放到消息中。EJB 2.0消息驅動Bean我們已經講述了JMS的基本概念,現在我們來談一談EJB2.0規范中的新概念。
  
  回顧一下前面講的JMS部分。我們有一個發送者,他把消息放到隊列中,然后一個接收者將讀取這個消息并使用接收到的信息來發送email。這個接收者可以是一個運行的程序,他接收“Email隊列”中的消息。為了實現這個動作我們需要一個接收者,這個接收者的結構答應一個消息流的并行處理,同時它還要處理事務,這將使我們能夠處理商業邏輯。這就是消息Bean的由來。也就是說一個消息Bean是一個簡單的JMS消費者。一個客戶端不能直接訪問消息Beans(像你訪問狀態Bean那樣)你只能通過發送JMS消息到消息Bean所偵聽的目的地。為了達到重用的目的,像其他的EJB一樣,許多的支持信息都在EJB部署描述符中。這意味著我們不必關心我們從那里獲得消息(不管是一個queue或者是topic),我們只需要寫一個OnMessage(Message msg)方法來處理消息就可以了。我們已經講述了JMS和MDB的知識;現在讓我們開始我們的例子吧.Email 應用程序的開發步驟:我們將通過下面幾步來完成email應用程序:在JMS服務器上安裝一個“Email Queue”消息隊列。創建一個email客戶端,他負責向emial 隊列發送java 消息。創建一個消息驅動Bean,他將處理這些消息,然后用這些信息用Email發送。為消息驅動Bean寫部署描述符。打包代碼。
  將被創建的代碼是:
  代碼
  描述
  com.customware.client.EmailClientemail客戶端,他將把消息發送到隊列中com.customware.ejb.EmailMDB消息驅動Bean將消耗來自客戶端的JMS消息,并且使用EmailHelper來發送郵件。com.customware.util.EmailHelper一個助手類,他有一個靜態方法sendmail(Map mail,這個方法將使用JavaMail發送郵件。
  
  第一步:安裝一個郵件消息隊列
  這一步將依靠于你的消息服務器(比如IBM MQSeries,SonicMQ,等等)。我們需要安裝一個JMS 隊列。我給他取名為EmailQueue,客戶端和消息驅動Bean部署描述符要用到它。
  
  第二步:創建一個Email客戶端 (EmailClient.java)現在我們需要創建一個客戶端(JMS sender)。這個客戶端截獲搜有關email的信息,然后把它發送出去。main()方法從命令行獲得參數,創建一個Hashtable(用于存儲Map),調用sendmail(Map m)方法。sendmail方法獲得信息,根據獲得的信息中創建一個MapMessage,再通過sender.send(message)把消息發送到EmailQueue隊列中。主要的工作在構造函數之中,這些是JMS工作的全部內容。
  下面是構造函數的內容:
  1.通過getInitialContext()助手方法連接到JNDI服務。
  2.為隊列查找一個連接工廠[(QueueConnectionFactory) ctx.lookup(CONNECTION_FACTORY)]
  3.為我們的JMS服務器創建一個隊列連接[conFactory.createQueueConnection()]
  4.創建一個JMS會話(session),這個會話用于生產和消費信息。[connection.createQueueSession(false, Session.AUTO_ACKNOWLEDGE)]5.查找隊列,他將發送消息[(Queue) ctx.lookup(QUEUE_NAME)]6.最后創建一個發送者,這個發送者將使用會話(我們前面創建的)發送消息到我們查找到的隊列中。
  
  第三步:創建一個消息Bean (EmailMDB.java)在寫會話 Bean或實體Bean時,你必須創建遠程接口、主接口和Bean類(實體Bean還有一個可選的主鍵類)。而消息Bean只需要Bean類,因為有一個“客戶端”他將作為Bean的接口。一個消息驅動Bean必須擴展兩個接口:
  接口描述
  MessageListener
  javax.jms.MessageListener這是JMS接口,他提供了一個onMessage(Message msg)方法。當一個消息放入隊列中時,消息驅動Bean的onMessage方法將被調用,容器將傳輸實際的消息來被消費。MessageDrivenBean
  javax.ejb.MessageDrivenBean這是EJB接口,他包含EJB生命周期的方法:ejbCreate(): 當EJB創建時容器會調用這個方法ejbRemove(): 當容器銷毀EJB時調用setMessageDrivenContext(MessageDrivenContext ctx): 當對象被裝載后ejbCreate()調用之前上下文環境被傳輸到EJB中. 上下文包含信息,容器保存這些信息并答應你查許、處理(getUserTransaction(), setRollbackOnly(), getRollbackOnly())
  security (getCallerPRincipal(), isCallerInRole())
  
  假如你看一下EmailMDB.java代碼你會發現開頭的幾個方法實現了MessageDrivenBean接口。我們在這些方法中作的所有事情就是打印他們被調用的信息。setMessageDrivenContext()把上下文環境保存到實例變量中,以便我們今后能夠找的到他。你要作的差不多就是這些了。最后要作的就是擴展MessageListener接口的onMessage(Message msg)方法。這就是我們消費消息并處理他們的過程。開始,我們通過拋出的消息創建一個MapMessage。然后我們從map消息中查找“鍵/”值對,把他們的值裝入標準的Hashtable。注重,這些方法我們是通過MapMessage調用的:// 從Map Message獲得鍵
  Enumeration mapnames = mapmessage.getMapNames();
  // 從MapMessage中獲得值
  String val = mapmessage.getString(key);
  
  最后,調用 EmailHelper.sendmail(map)方法,把消息當作郵件發送出去。是不是很簡單。這就是是消息驅動Bean重要的部分,我們沒有寫那些晦澀的JMS代碼。實際上消息驅動Bean是如何知道從那里獲得這些消息?這些我們是通過部署描述符來實現的。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 萨迦县| 昂仁县| 商洛市| 稷山县| 凤凰县| 华容县| 江源县| 嵩明县| 萍乡市| 临邑县| 台安县| 麻栗坡县| 托克托县| 安徽省| 会昌县| 依安县| 阿拉善左旗| 福清市| 山西省| 华亭县| 延津县| 朝阳县| 和平县| 博客| 偏关县| 阳江市| 施秉县| 金湖县| 嘉兴市| 齐齐哈尔市| 茶陵县| 宾阳县| 万荣县| 遵义县| 永顺县| 墨脱县| 宁城县| 海安县| 尚志市| 开江县| 彭山县|