面試被問 JMS 核心概念答不上來,痛定思痛系統整理。本文涵蓋JMS 定義與定位、1.1 vs 2.0 版本差異、核心術語體系、標準接口架構、ActiveMQ 支持現狀,為後續深入實戰打下堅實理論基礎。
Java Message Service (JMS) API is a messaging standard that allows application components based on the Java Platform Enterprise Edition (Java EE) to create, send, receive, and read messages. It enables distributed communication that is loosely coupled, reliable, and asynchronous.
關鍵點:
javax.jms.*),具體實現由 **JMS Provider** 提供 (ActiveMQ、RabbitMQ、Kafka、RocketMQ 等)| 特性 | JMS 1.1 (2002) | JMS 2.0 (2013, Java EE 7) | ||
|---|---|---|---|---|
| API 風格 | 冗長、樣板代碼多 | **簡化 API**,利用 JDK 7 try-with-resources、Lambda | ||
| 資源管理 | 手動 close Connection/Session | JMSContext 統一管理,自動關閉 | ||
| 共享訂閱 | 不支援 (需 Selector 變通) | **原生支援 Shared Topic Subscription**,多消費者負載均衡 | ||
| JMSXDeliveryCount | 可選 | **強制設置**,標識重試次數 | ||
| 主流 Broker 支持 | 全部支援 | ActiveMQ 5.x **不完全支援** (Artemis 2.x 支援),RabbitMQ/Kafka 需客端適配 | ||
| 術語 | 別名 | 角色 | P2P (Queue) | Pub/Sub (Topic) |
|---|---|---|---|---|
| JMS Provider | 消息中間件/Broker | 實現 JMS 規範的產品 | ActiveMQ, RabbitMQ, Kafka, RocketMQ | |
| Destination | 目標地址 | 消息存儲/路由節點 | Queue (隊列) | Topic (主題) |
| Message | 消息 | 數據載體 | Header + Properties + Body (Text/Bytes/Map/Object/Stream) | |
| Producer | 生產者 | 發送消息 | QueueSender | TopicPublisher |
| Consumer | 消費者 | 接收消息 | QueueReceiver | TopicSubscriber |
| MessageListener | 監聽器 | 異步回調接口 | onMessage(Message msg) | |
| 維度 | Point-to-Point (Queue) | Publish/Subscribe (Topic) |
|---|---|---|
| 消息模型 | **負載均衡**:一條消息**僅被一個**消費者接收 | **廣播**:一條消息**被所有**訂閱者接收 |
| 消費者關係 | 競爭關係 (多消費者分擔) | 獨立關係 (各自收全量) |
| 持久化 | 天然持久,消費者離線消息保留 | 默認非持久,**持久訂閱** 需 createDurableSubscriber |
| 適用場景 | 任務分發、命令執行、訂單處理 | 事件通知、廣播、股價推送、日志收集 |
| JMS 2.0 共享訂閱 | 不適用 | createSharedConsumer(topic, "sharedName") 實現負載均衡 |
// Spring XML 整合
// 生產者
jmsTemplate.convertAndSend("ORDER_QUEUE", orderDto);
// 消費者 (監聽器容器)
JMS 是企業級異步解耦基石。徹底搞懂「標準 vs 實現」、「Queue vs Topic」、「同步 vs 異步」、「事務 vs 確認」四對核心辯證關係,你就擁有了駕馭任何消息中間件的通用認知框架。