JMS (Java Message Service) 是 Java EE 標準化的訊息中介軟體 API,解決異構系統間可靠、異步、鬆耦合通訊問題。支援 Point-to-Point (P2P) 與 Publish/Subscribe (Pub/Sub) 兩大模型,廣泛用於訂單處理、通知推送、日誌收集、微服務事件驅動等場景。
| 組件 | 角色 | 關鍵介面/類 |
|---|---|---|
| ConnectionFactory | 建立 Connection 的工廠,透過 JNDI 查找 | QueueConnectionFactory / TopicConnectionFactory |
| Connection | 對訊息伺服器的連線,支援啟動/關閉/異常監聽 | QueueConnection / TopicConnection |
| Session | 單執行緒上下文,生產/消費訊息、事務控制、確認模式 | QueueSession / TopicSession |
| Destination | 訊息目的地:Queue (P2P) 或 Topic (Pub/Sub) | Queue / Topic |
| MessageProducer | 發送訊息 | QueueSender / TopicPublisher |
| MessageConsumer | 接收訊息(同步 receive 或非同步 MessageListener) | QueueReceiver / TopicSubscriber |
| Message | 訊息本體:Header + Properties + Body (Text/Bytes/Map/Object/Stream) | TextMessage 等 |
createDurableSubscriber(topic, "subName"),訂閱者離線時訊息保留,重新連線時收取。| 需求 | 選擇 |
|---|---|
| 每條訊息必須被處理,且只能由一個消費者處理 | P2P (Queue) |
| 訊息需廣播給多方,允許部分消費者錯過 | Pub/Sub (Topic, 非持久) |
| 廣播給多方,且每方都必須收到(離線補發) | Pub/Sub (Topic, 持久訂閱) |
| 請求-回應模式 | P2P (臨時回覆 Queue) |
AUTO_ACKNOWLEDGE:Session 自動確認(預設,效能最好,可能重複/丟失)。CLIENT_ACKNOWLEDGE:客戶端手動調用 message.acknowledge()(精確控制,效能稍低)。DUPS_OK_ACKNOWLEDGE:懶惰確認,允許重複(高吞吐、容忍重複)。SESSION_TRANSACTED:事務性 Session,commit()/rollback() 原子確認。DeliveryMode.PERSISTENT:訊息寫入磁碟/資料庫,Broker 重啟不丟失(預設)。DeliveryMode.NON_PERSISTENT:僅記憶體,高吞吐低延遲,Broker 重啟丟失。producer.send(msg, DeliveryMode.PERSISTENT, priority, timeToLive);publisher.publish(msg, DeliveryMode.PERSISTENT, 8, 10000); (優先級 8,TTL 10秒)SQL92 風格過濾:consumer = session.createConsumer(queue, "orderType='VIP' AND amount > 1000");,Broker 端過濾,減少網路傳輸。
ExceptionListener 監聽連線斷開,觸發重連邏輯。JMSContext、CompletionListener、@JMSListener 註解驅動。JmsTemplate、@JmsListener、自動重連、錯誤處理器。JMS 以標準化 API 屏蔽了底層 Broker 差異,掌握 P2P 與 Pub/Sub 兩大模型、確認機制、持久化、優先級、選擇器等核心概念,即可設計出高可靠、鬆耦合的企業級異步系統。