首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> Java 程式設計 >> Java 相關知識

J2EE 非同步訊息機制(下):訊息驅動 Bean 實作與部署

     編輯:Java 相關知識

三、訊息驅動 Bean 簡介

非同步訊息也可由訊息驅動 Bean (Message-Driven Bean, MDB) 實作。EJB 1.1 規範定義了兩種 EJB:實體 Bean 與工作階段 Bean。客戶端通常以同步、阻塞方式呼叫 Bean 方法。訊息驅動 Bean 將 EJB 與 JMS 功能結合。

工作階段 Bean 通常實作商務邏輯,客戶端無法共享單一工作階段 Bean。實體 Bean 對應永久儲存中的實體項目。兩者通常都有 Remote 與 Home 介面與客戶端互動,且互動皆為同步阻塞方式。例如請求發送給 Bean,透過阻塞式方法呼叫,伺服器回傳回應,呼叫者收到回應後才能進行下一步。

訊息驅動 Bean 通常配置為特定主題或佇列的客戶端,作為訊息消費者。但 MDB 沒有 Home 與 Remote 介面。訊息生產者將訊息寫入 Topic 或佇列時,不知道消費者是 MDB,這讓整合分散式運算系統擁有極大彈性。MDB 沒有工作階段性質的狀態,所有實例在不處理請求時相同,類似無狀態工作階段 Bean。將 Bean 實例放入緩衝池是高效處理 MDB 的方法之一。

MDB 必須直接或間接繼承 javax.ejb.MessageDrivenBean 介面,該介面繼承自 javax.jms.MessageListener。onMessage() 方法參數為 javax.jms.Message,可以是任何有效 JMS 訊息型別。方法宣告不包含 throws 子句,因此訊息處理中不會拋出應用程式例外。容器接收訊息時,先從緩衝池取得 MDB 實例,若部署描述檔要求,建立與交易處理上下文的關聯。管理任務完成後,接收到的訊息傳遞給 onMessage()。方法完成後,交易確認或回滾,Bean 重新放回緩衝池。

ejbRemove() 在移除 MDB 時呼叫,進行清理與垃圾回收,必須釋放所有 Bean 實例使用的資源。setMessageDrivenContext() 單一參數為 javax.ejb.MessageDrivenContext 實例,類似實體與工作階段 Bean 的上下文。Bean 實例建立時,容器傳入上下文,可取得環境資訊方法與 JTA UserTransaction 供 Bean 管理交易處理。此外,Bean 提供者必須提供無參數 ejbCreate() 方法,用於 EJB 伺服器對 Bean 進行設定,Bean 實例可在其中取得所需資源。

MDB 大幅簡化建立 JMS 消費者,建立與配置 JMS 消息消費者功能交由 EJB 容器處理。開發人員只需簡單實作 MDB 介面,配置給 EJB 伺服器,即可建立接收訊息的商務邏輯元件。

四、實作範例

本文編寫一個 MDB、一個 Publisher 與一個 Subscriber 程式碼說明概念。假設讀者已下載並安裝 J2EE SDK 1.3 Beta。

1. 建立 WeatherReport 主題

j2eeadmin -addJmsDestination WeatherReport topic

驗證建立:

D:\j2sdkee1.3\bin>j2eeadmin -listJmsDestination JmsDestination

典型結果:

< JMS Destination : jms/Topic , javax.jms.Topic >
< JMS Destination : jms/Queue , javax.jms.Queue >
< JMS Destination : WeatherReport , javax.jms.Topic >

2. 執行 Subscriber

D:\mysourcecode\testjms>java -Djms.properties=%J2EE_HOME%\config\jms_client.properties jmssub

典型輸出:

Topic name is WeatherReport
Java(TM) Message Service 1.0.2 Reference Implementation (build b10)
To end program, enter Q or q, then
Reading message: A sunny day.

3. 執行 Publisher

開啟另一命令視窗:

set classpath=%J2EE_HOME%\lib\j2ee.jar;.
java -Djms.properties=%J2EE_HOME%\config\jms_client.properties jmspub

典型輸出:

Topic name is WeatherReport
Java(TM) Message Service 1.0.2 Reference Implementation (build b10)
Publishing message: A sunny day.

4. 刪除主題

D:\j2sdkee1.3\bin>j2eeadmin -removeJmsDestination MyTopic

5. 使用訊息驅動 Bean

用 deploytool 部署附錄中的 Bean,可見:

Deploying message driven bean MsgBean, consuming from WeatherReport
Application testjms deployed.

再次執行 Publisher,MDB 輸出:

MESSAGE BEAN: Message received: A sunny day.
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved