在異構系統集成中,數據交換格式不一、同步阻塞、緊耦合是常見痛點。Java Message Service (JMS) 作為 J2EE 標準消息中間件 API,提供統一的發送/接收接口,支持異步通信、鬆耦合集成,是構建跨平台企業級應用的關鍵基礎設施。
JMS 定義兩種消息傳遞模式,開發者需根據業務場景選擇:
| 特性 | Point-to-Point (P2P) | Publish/Subscribe (Pub/Sub) |
|---|---|---|
| 通信模式 | 一對一,隊列 | 一對多,主題 |
| 消息保證 | 每條消息必達,唯一消費者 | 允許一定丟失,多訂閱者 |
| 適用場景 | 訂單處理、任務分發、需確保處理的業務 | 廣播通知、股價推送、日誌收集 |
| 持久訂閱 | 不適用 | 支持:離線訂閱者上線後收到消息 |
// 創建持久訂閱者
TopicSubscriber subscriber = topicSession.createDurableSubscriber(topic, "subName");
QueueConnectionFactory (P2P) 和 TopicConnectionFactory (Pub/Sub)。start() 啟動消息投遞,stop() 暫停。非事務 Session 提供三種確認模式:
AUTO_ACKNOWLEDGE:自動確認(默認,最常用)CLIENT_ACKNOWLEDGE:客戶端手動調用 message.acknowledge()DUPS_OK_ACKNOWLEDGE:懶惰確認,允許重複,僅用於容忍重複的場景PERSISTENT 消息經存儲轉發,服務器宕機不丟失;NON_PERSISTENT 最多投遞一次,性能更高但可能丟失。// 發送持久、優先級8、TTL 10秒的消息
topicPublisher.publish(message, DeliveryMode.PERSISTENT, 8, 10000); // Pub/Sub
queueSender.send(message, DeliveryMode.PERSISTENT, 8, 10000); // P2P
| 類型 | 載荷結構 | 典型用途 |
|---|---|---|
| StreamMessage | Java 基本類型流 | 結構化數據流 |
| MapMessage | 名值對集合 | 鍵值對傳遞 |
| TextMessage | String 對象 | XML、JSON、純文本 |
| ObjectMessage | 序列化 Java 對象 | 對象傳遞 |
| BytesMessage | 原始字節流 | 二進制數據、自定義編碼 |
實現 javax.jms.MessageListener 接口,重寫 onMessage(Message),註冊到 MessageConsumer,實現事件驅動消費。
public class OrderListener implements MessageListener {
public void onMessage(Message msg) {
TextMessage txt = (TextMessage) msg;
// 解析 XML、業務處理...
}
}
消息驅動 Bean (MDB) 是 EJB 容器管理的異步消費者,無 Home/Remote 接口,匿名、不可直接被客戶端調用。部署描述符聲明目標隊列/主題、事務屬性、安全身份。
<message-driven>
<ejb-name>OrderMDB</ejb-name>
<ejb-class>com.example.OrderMDB</ejb-class>
<transaction-type>Container</transaction-type>
<message-driven-destination>
<jms-destination-type>javax.jms.Queue</jms-destination-type>
</message-driven-destination>
</message-driven>
銷售、庫存、發貨、客服、財務五大系統通過 JMS 解耦:
所有系統自動根據消息更新狀態,無需同步調用、無單點故障,實現真正的鬆耦合企業集成。
雖 JMS 無原生 XML 類型,但發送 TextMessage 載荷 XML 即可實現非專有數據交換。若使用廠商擴展的 XML 消息類型,需注意可移植性風險。
JMS 以標準化 API、異步模型、鬆耦合特性,成為異構系統集成、微服務通信、事件驅動架構的基石。掌握兩大模型、確認機制、持久化策略、MDB 開發,是 J2EE 架構師與高級開發者的必備技能。