EJB 1.1 定義 Entity Bean 與 Session Bean,Client 以同步阻塞方式呼叫。MDB 結合 EJB 與 JMS 功能,實現非同步訊息處理:
javax.ejb.MessageDrivenBean(繼承自 javax.jms.MessageListener)。onMessage(Message msg):參數為任意有效 JMS 訊息類型,不拋應用例外。容器從池取實例 → 設定事務上下文 → 呼叫 onMessage → 事務確認/回滾 → 實例回池。ejbRemove():刪除時調用,必須釋放所有資源。setMessageDrivenContext(MessageDrivenContext ctx):實例建立時注入上下文,提供環境資訊與 JTA UserTransaction。ejbCreate():無參數,EJB 伺服器設定 Bean 時調用,可取得所需資源。MDB 大幅簡化 JMS Consumer 建立與配置,開發者僅需實作介面、配置部署、撰寫接收訊息的商業邏輯。
假設已安裝 J2EE SDK 1.3 Beta。
# 建立 Topic
j2eeadmin -addJmsDestination WeatherReport topic
# 驗證
j2eeadmin -listJmsDestination
# 輸出應含:< JMS Destination : WeatherReport , javax.jms.Topic >
java -Djms.properties=%J2EE_HOME%\config\jms_client.properties jmssub
# 輸出:Topic name is WeatherReport ... Reading message: A sunny day.
set classpath=%J2EE_HOME%\lib\j2ee.jar;.
java -Djms.properties=%J2EE_HOME%\config\jms_client.properties jmspub
# 輸出:Publishing message: A sunny day.
j2eeadmin -removeJmsDestination MyTopic
Deploying message driven bean MsgBean, consuming from WeatherReportMESSAGE BEAN: Message received: A sunny day.範例包含:MsgBean (MDB)、jmspub (Publisher)、jmssub (Subscriber) 完整原始碼,展示 MDB 如何取代傳統 Subscriber 實現非同步接收。