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

全面研讀 EJB 2.0 (下):MessageDrivenBean 異步訊息處理架構完整解析

     編輯:J2EE

MessageDrivenBean (MDB) 概述

  • EJB 2.0 全新 Bean 型別,專門處理輸入 JMS 訊息
  • 整合 JMS (Java Message Service) 與 EJB 容器服務 (事務、安全、並發、資源管理)
  • 為 JMS 客戶端提供元件模型,部署於強健的 EJB 容器環境

JMS 基礎概念速覽

概念說明
JMS Client訊息產生者或消費者
Destination虛擬通道:Topic (發布/訂閱) 或 Queue (點對點)
MessageHeader (路由/中繼資料) + Body (Payload)
訊息型別TextMessage、ObjectMessage、MapMessage、BytesMessage、StreamMessage、Message (無主體)
非同步特性發送者不等待回應,發送後繼續執行;訊息經由中介轉發給訂閱者

EJB 2.0 整合 JMS 兩種模式

  1. JMS 作為資源:Session/Entity Bean 透過 JNDI 取得 ConnectionFactory/Destination,發送訊息 (產生者)
  2. MessageDrivenBean:監聽特定 Destination,消費訊息 (消費者)

Session Bean 發送訊息範例

public class ShoppingCartBean implements SessionBean {
    public OrderDetail orderDetail;
    public void processOrder() {
        // ... 處理訂單邏輯 ...
        InitialContext jndi = new InitialContext();
        TopicConnectionFactory factory = (TopicConnectionFactory) jndi.lookup("java:comp/env/jms/topicfactory");
        Topic orderTopic = (Topic) jndi.lookup("java:comp/env/jms/ordertopic");
        TopicConnection con = factory.createTopicConnection();
        TopicSession session = con.createTopicSession(false, Session.AUTO_ACKNOWLEDGE);
        TopicPublisher publisher = session.createPublisher(orderTopic);
        ObjectMessage msg = session.createObjectMessage(orderDetail);
        publisher.publish(msg);
        con.close();
    }
}

優點:非阻塞、鬆耦合、動態增減訂閱者 (庫存系統、行銷系統等)

MessageDrivenBean 完整實作

介面定義

package javax.ejb;
import javax.jms.Message;
import javax.jms.MessageListener;

public interface MessageDrivenBean extends MessageListener {
    public void onMessage(Message message);
    public void ejbCreate();
    public void ejbRemove();
    public void setMessageDrivenContext(MessageDrivenContext mdc);
}

MarketingBean 範例:消費訂單訊息加入郵寄清單

public class MarketingBean implements javax.ejb.MessageDrivenBean {
    public void onMessage(Message message) {
        ObjectMessage msg = (ObjectMessage) message;
        OrderDetail order = (OrderDetail) msg.getObject();
        Integer customerId = order.getCustomerID();
        InitialContext jndi = new InitialContext();
        CatalogHome home = (CatalogHome) jndi.lookup("java:comp/env/ejb/catalog");
        Iterator it = order.getProductIDs().iterator();
        while (it.hasNext()) {
            Integer pid = (Integer) it.next();
            Catalog cat = home.findByProductID(pid);
            cat.addCustomerToMailingList(customerId);
        }
    }
    public void ejbCreate() {}
    public void ejbRemove() {}
    public void setMessageDrivenContext(MessageDrivenContext mdc) {}
}

MDB 與 Session/Entity Bean 關鍵差異

特性Session/Entity BeanMessageDrivenBean
介面Remote/Home 或 Local/Home無 Remote/Home 介面
呼叫方式RPC 同步呼叫非同步訊息消費
業務方法客戶端呼叫無 (僅 `onMessage`)
狀態管理Stateful/Stateless本質無狀態 (實例變數僅在實例生命期有效)
並發處理容器序列化存取多實例並發消費,吞吐量遠高於傳統 JMS Client
訊息來源通常為其他 Bean任意 JMS 相容來源 (Bean、Java App、非 Java App、MQSeries 等)

部署描述符關鍵配置

  • 指定 Destination Type:`javax.jms.Topic` 或 `javax.jms.Queue`
  • 指定 Destination JNDI 名稱
  • 交易屬性:通常 `Required` (容器管理交易)
  • 訊息確認模式:`Auto-acknowledge` 或 `Dups-ok-acknowledge`

結語

MDB 將訊息導向中介架構 (MOM) 引入 EJB 標準,賦予異步處理事務性、安全性、可擴展性與並發優勢。訊息處理成為分散式混合運算核心組件,納入 EJB 證明其戰略地位。規範以公開草案發布,細節可能微調,但架構已趨穩定。

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