企業消息傳遞是異構系統集成的基石。Java Message Service (JMS) 作為 J2EE 標準,屏蔽了底層 MOM(面向消息中間件)差異,提供統一 API。本文深度解析 JMS 兩大傳遞模型、三類客戶端模式優劣,並給出場景化選型建議。
| 模型 | 目標類型 | 特點 |
|---|---|---|
| 點對點 (P2P) | Queue 隊列 | 一對一,消息被單個消費者接收並移除,支持負載均衡 |
| 發布-訂閱 | Topic 主題 | 一對多/多對多,消息廣播給所有訂閱者,支持持久/非持久訂閱 |
適用:Applet、Swing 桌面程序、命令行工具、Java Web Start
實現:僅需少量 JMS API 調用 + JNDI JAR 包即可接入
| 優點 | 缺點 |
|---|---|
| 極簡輕量,部署零配置 所有 J2SE 應用無縫擴展 適合瘦客戶端場景 | 安全性/事務依賴廠商實現,非標準 無內建並發處理,需自行多線程 同步調用,無異步監聽能力 擴展性差,高併發下成「偽簡單」 |
適用:需在 EJB 事務上下文中收發消息、訪問多個 Queue/Topic、整合現有業務邏輯
實現:通過 Resource Manager Connection Factory 獲取 JMS Connection
| 優點 | 缺點 |
|---|---|
| 享受完整 EJB 容器服務:聲明式事務、安全、並發、資源管理 無 Queue/Topic 數量限制 可在事務中原子性收發消息+更新數據庫 | 需成熟 EJB 容器,客戶端占用空間大 同步調用模式,無異步監聽能力 開發/部署複雜度高 |
定位:專門消費異步 JMS 消息的無狀態 Bean,由容器生命週期管理
實現:實現 MessageDrivenBean + MessageListener 接口,配置 ejb-jar.xml 指定目標 Destination
| 優點 | 缺點 |
|---|---|
| 真正異步消費,容器自動並發(池化實例) 極佳擴展性,天然支持高併發 複用 EJB 投資:可調用 Session/Entity Bean 聲明式配置,無樣板代碼 | 相對較新,廠商支持成熟度不一 僅能消費消息,非生產者首選 單 MDB 只能映射一個 Destination 最佳實踐尚在沉澱中 |

圖 1. JMS 消息結構:Header(路由/標識)、Properties(應用屬性)、Body(載荷:Text/Bytes/Map/Object/Stream)
企業級系統常混合使用:前端瘦客戶端用簡單 JMS 發送命令;後端 MDB 消費並調用 Session Bean 處理業務;報表模塊用 Session Bean + JMS 發送異步通知。關鍵在於根據組件職責選擇最匹配的模式,而非全盤統一。
JMS 提供了廠商無關、平台無關的企業消息傳遞標準。選型核心權衡:簡單性 vs 企業級特性(事務/安全/擴展性)vs 異步能力。理解三種模式邊界,結合業務場景組合使用,才能構建健壯、可擴展的消息驅動架構。