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

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

     編輯:J2EE

一、MDB 核心特性與架構定位

EJB 1.1 定義 Entity Bean 與 Session Bean,Client 以同步阻塞方式呼叫。MDB 結合 EJB 與 JMS 功能,實現非同步訊息處理:

  • 配置為特定 Topic/Queue 的消費者,無 Home/Remote 介面。
  • 訊息生產者寫入訊息時不知消費者為 MDB,提供極大整合彈性。
  • 無會話狀態,所有實例等價(類無狀態 Session Bean),支援實例池化與併發處理。
  • 繼承 javax.ejb.MessageDrivenBean(繼承自 javax.jms.MessageListener)。

二、MDB 關鍵方法契約

  • onMessage(Message msg):參數為任意有效 JMS 訊息類型,不拋應用例外。容器從池取實例 → 設定事務上下文 → 呼叫 onMessage → 事務確認/回滾 → 實例回池。
  • ejbRemove():刪除時調用,必須釋放所有資源。
  • setMessageDrivenContext(MessageDrivenContext ctx):實例建立時注入上下文,提供環境資訊與 JTA UserTransaction。
  • ejbCreate():無參數,EJB 伺服器設定 Bean 時調用,可取得所需資源。

MDB 大幅簡化 JMS Consumer 建立與配置,開發者僅需實作介面、配置部署、撰寫接收訊息的商業邏輯。

三、完整範例:WeatherReport Topic 應用

3.1 環境準備

假設已安裝 J2EE SDK 1.3 Beta。

3.2 建立與驗證 Topic

# 建立 Topic
j2eeadmin -addJmsDestination WeatherReport topic
# 驗證
j2eeadmin -listJmsDestination
# 輸出應含:< JMS Destination : WeatherReport , javax.jms.Topic >

3.3 執行 Subscriber (訂閱者)

java -Djms.properties=%J2EE_HOME%\config\jms_client.properties jmssub
# 輸出:Topic name is WeatherReport ... Reading message: A sunny day.

3.4 執行 Publisher (發布者)

set classpath=%J2EE_HOME%\lib\j2ee.jar;.
java -Djms.properties=%J2EE_HOME%\config\jms_client.properties jmspub
# 輸出:Publishing message: A sunny day.

3.5 刪除 Topic

j2eeadmin -removeJmsDestination MyTopic

3.6 使用 MDB 接收訊息

  1. 用 deploytool 部署 MDB (MsgBean),消費來源指定 WeatherReport。部署成功顯示:Deploying message driven bean MsgBean, consuming from WeatherReport
  2. 再次執行 Publisher
  3. 伺服器控制台輸出:MESSAGE BEAN: Message received: A sunny day.

四、附錄程式碼結構

範例包含:MsgBean (MDB)、jmspub (Publisher)、jmssub (Subscriber) 完整原始碼,展示 MDB 如何取代傳統 Subscriber 實現非同步接收。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved