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

J2EE 元件開發深度解析:Message-Driven Bean (MDB) 完整架構、介面、部署與實戰範例

     編輯:J2EE

JMS 基礎:訊息服務核心模型

  • 特性:可靠、異步、鬆耦合、語言/平台中立、可配置
  • 原理:封裝訊息,在 Client 端加入處理層,提供統一 API 隔離底層實現
  • 兩種模式:
    • Point-to-Point (Queue):單消費者、無時間依賴、支援確認機制
    • Publish-Subscribe (Topic):多消費者、有時間依賴(訂閱後才收訊息)、支援持久訂閱

MDB 定位:EJB 容器管理的異步訊息消費者

  • EJB 2.0 引入,實作 MessageListener + MessageDrivenBean
  • **無 Home/Remote 介面**,客戶端不直接呼叫,僅發送 JMS 訊息
  • 類無狀態、實例等價、容器管理實例池實現併發處理
  • 核心方法:onMessage(Message) — 容器收到訊息回調
  • 支援交易:onMessage 內操作納入交易,回滾則重投遞

MDB 類結構與生命週期介面

public class MyMDB implements MessageDrivenBean, MessageListener {
    // 1. 注入容器上下文
    public void setMessageDrivenContext(MessageDrivenContext ctx) { ... }

    // 2. 實例化初始化(無參數)
    public void ejbCreate() { ... }

    // 3. 核心業務:處理訊息
    public void onMessage(Message msg) {
        if (msg instanceof TextMessage) {
            TextMessage tm = (TextMessage) msg;
            System.out.println("收到: " + tm.getText());
        }
    }

    // 4. 清理資源(容器決定調用時機,異常時可能不調用)
    public void ejbRemove() { ... }
}

關鍵約束:public 類、非 abstract/final、public 無參建構子、**不實作 finalize()**、不定義業務介面。

JMS 訊息類型體系

介面封裝內容對應類
Message 根介面,Header/Property 操作 —
TextMessage String String 訊息
ObjectMessage Serializable 物件 Java 物件序列化
BytesMessage byte[] 二進制資料
MapMessage Key-Value pairs Map 結構
StreamMessage I/O Stream 資料流

客戶端發送訊息:標準 JMS API

// P2P Queue 範例
QueueConnectionFactory qcf = (QueueConnectionFactory) jndi.lookup("java:comp/env/jms/MyQCF");
Queue queue = (Queue) jndi.lookup("java:comp/env/jms/QueueName");

QueueConnection qc = qcf.createQueueConnection();
QueueSession qs = qc.createQueueSession(false, Session.AUTO_ACKNOWLEDGE);
QueueSender sender = qs.createSender(queue);

TextMessage msg = qs.createTextMessage();
for (int i=0; i<3; i++) {
    msg.setText("Msg " + i);
    sender.send(msg);
}

客戶端**完全不知道**接收端是 MDB,純 JMS 程式設計。

部署描述檔:ejb-jar.xml 關鍵配置

<message-driven>
  <ejb-name>SimpleMessageEJB</ejb-name>
  <ejb-class>SimpleMessageEJB</ejb-class>
  <transaction-type>Container</transaction-type>
  <message-destination-type>javax.jms.Queue</message-destination-type>
  <activation-config>
    <activation-config-property>
      <activation-config-property-name>destinationType</activation-config-property-name>
      <activation-config-property-value>javax.jms.Queue</activation-config-property-value>
    </activation-config-property>
  </activation-config>
</message-driven>

完整範例:SimpleMessageClient + SimpleMessageEJB

  1. Client 發送 3 條 TextMessage 到 Queue
  2. J2EE Server (JMS Provider) 遞送至 MDB 實例
  3. MDB onMessage 列印訊息內容

部署步驟:j2ee -verbose → j2eeadmin -addJmsDestination jms/MyQueue queue → deploytool 部署 EAR → runclient 執行 Client。

總結

MDB 是 **J2EE 異步處理的標準化入口**,將訊息驅動邏輯納入 EJB 容器管理(交易、安全、池化、監控),實現「發送者不知接收者、接收者不知發送者」的極致解耦。

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