| 概念 | 說明 |
|---|---|
| JMS Client | 訊息產生者或消費者 |
| Destination | 虛擬通道:Topic (發布/訂閱) 或 Queue (點對點) |
| Message | Header (路由/中繼資料) + Body (Payload) |
| 訊息型別 | TextMessage、ObjectMessage、MapMessage、BytesMessage、StreamMessage、Message (無主體) |
| 非同步特性 | 發送者不等待回應,發送後繼續執行;訊息經由中介轉發給訂閱者 |
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();
}
}
優點:非阻塞、鬆耦合、動態增減訂閱者 (庫存系統、行銷系統等)
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);
}
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) {}
}
| 特性 | Session/Entity Bean | MessageDrivenBean |
|---|---|---|
| 介面 | Remote/Home 或 Local/Home | 無 Remote/Home 介面 |
| 呼叫方式 | RPC 同步呼叫 | 非同步訊息消費 |
| 業務方法 | 客戶端呼叫 | 無 (僅 `onMessage`) |
| 狀態管理 | Stateful/Stateless | 本質無狀態 (實例變數僅在實例生命期有效) |
| 並發處理 | 容器序列化存取 | 多實例並發消費,吞吐量遠高於傳統 JMS Client |
| 訊息來源 | 通常為其他 Bean | 任意 JMS 相容來源 (Bean、Java App、非 Java App、MQSeries 等) |
MDB 將訊息導向中介架構 (MOM) 引入 EJB 標準,賦予異步處理事務性、安全性、可擴展性與並發優勢。訊息處理成為分散式混合運算核心組件,納入 EJB 證明其戰略地位。規範以公開草案發布,細節可能微調,但架構已趨穩定。