MessageListener + MessageDrivenBeanonMessage(Message) — 容器收到訊息回調onMessage 內操作納入交易,回滾則重投遞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()**、不定義業務介面。
| 介面 | 封裝內容 | 對應類 |
|---|---|---|
Message |
根介面,Header/Property 操作 | — |
TextMessage |
String | String 訊息 |
ObjectMessage |
Serializable 物件 | Java 物件序列化 |
BytesMessage |
byte[] | 二進制資料 |
MapMessage |
Key-Value pairs | Map 結構 |
StreamMessage |
I/O Stream | 資料流 |
// 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 程式設計。
<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>
onMessage 列印訊息內容部署步驟:j2ee -verbose → j2eeadmin -addJmsDestination jms/MyQueue queue → deploytool 部署 EAR → runclient 執行 Client。
MDB 是 **J2EE 異步處理的標準化入口**,將訊息驅動邏輯納入 EJB 容器管理(交易、安全、池化、監控),實現「發送者不知接收者、接收者不知發送者」的極致解耦。