首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> Java 程式設計 >> Java 綜合教學

JMS 學習筆記(一):核心概念、版本差異、術語體系與架構圖解

     編輯:Java 綜合教學

JMS (Java Message Service) 核心概念全景:從面試失敗到徹底搞懂消息中間件標準、P2P/Pub-Sub、Provider/Client 架構

面試被問 JMS 核心概念答不上來,痛定思痛系統整理。本文涵蓋JMS 定義與定位、1.1 vs 2.0 版本差異、核心術語體系、標準接口架構、ActiveMQ 支持現狀,為後續深入實戰打下堅實理論基礎。

一、JMS 是什麼?

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.

關鍵點:

  • 標準 ≠ 實現:JMS 是 **API 規範** (接口包 javax.jms.*),具體實現由 **JMS Provider** 提供 (ActiveMQ、RabbitMQ、Kafka、RocketMQ 等)
  • 異步解耦:生產者發送後立即返回,不等待消費者處理,通過 Broker 中轉
  • 可靠傳遞:持久化、確認機制、事務支撐

二、版本演進:JMS 1.1 vs 2.0

現狀:生產環境多數仍基於 **JMS 1.1 + ActiveMQ 5.x**,本系列以 1.1 為主講解,2.0 特性專節補充。

三、核心術語對照表

特性JMS 1.1 (2002)JMS 2.0 (2013, Java EE 7)
API 風格冗長、樣板代碼多**簡化 API**,利用 JDK 7 try-with-resources、Lambda
資源管理手動 close Connection/SessionJMSContext 統一管理,自動關閉
共享訂閱不支援 (需 Selector 變通)**原生支援 Shared Topic Subscription**,多消費者負載均衡
JMSXDeliveryCount可選**強制設置**,標識重試次數
主流 Broker 支持全部支援ActiveMQ 5.x **不完全支援** (Artemis 2.x 支援),RabbitMQ/Kafka 需客端適配

四、JMS 標準接口架構 (javax.jms.*)


// 1. 連接工廠:創建 Connection
ConnectionFactory factory = ... // JNDI 查找或 new ActiveMQConnectionFactory()

// 2. 連接:物理連接,啟動後才能收發
Connection connection = factory.createConnection();
connection.start(); // 關鍵:不 start 消費者收不到消息

// 3. 會話:單線程上下文,事務/確認模式邊界
// transacted=true → 事務模式,ackMode 被忽略
// transacted=false → 確認模式:AUTO_ACK / CLIENT_ACK / DUPS_OK_ACK
Session session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE);

// 4. 目標:Queue 或 Topic
Queue queue = session.createQueue("ORDER_QUEUE");
Topic topic = session.createTopic("NOTIFICATION_TOPIC");

// 5. 生產者/消費者
MessageProducer producer = session.createProducer(queue);
MessageConsumer consumer = session.createConsumer(queue);

// 6. 消息創建與發送
TextMessage msg = session.createTextMessage("訂單內容 JSON");
producer.send(msg);

// 7. 同步接收 (阻塞)
Message received = consumer.receive(5000); // 超時 5s
if (received instanceof TextMessage) {
    System.out.println(((TextMessage)received).getText());
}

// 8. 異步監聽 (推薦生產)
consumer.setMessageListener(message -> {
    try { System.out.println(((TextMessage)message).getText()); }
    catch (JMSException e) { e.printStackTrace(); }
});

// 9. 關閉資源 (逆序)
consumer.close();
producer.close();
session.close();
connection.close();

五、兩種消息模式深度對比

術語別名角色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生產者發送消息QueueSenderTopicPublisher
Consumer消費者接收消息QueueReceiverTopicSubscriber
MessageListener監聽器異步回調接口onMessage(Message msg)
維度Point-to-Point (Queue)Publish/Subscribe (Topic)
消息模型**負載均衡**:一條消息**僅被一個**消費者接收**廣播**:一條消息**被所有**訂閱者接收
消費者關係競爭關係 (多消費者分擔)獨立關係 (各自收全量)
持久化天然持久,消費者離線消息保留默認非持久,**持久訂閱** 需 createDurableSubscriber
適用場景任務分發、命令執行、訂單處理事件通知、廣播、股價推送、日志收集
JMS 2.0 共享訂閱不適用createSharedConsumer(topic, "sharedName") 實現負載均衡

六、ActiveMQ 5.x 配置要點 (JMS 1.1 環境)


// Spring XML 整合

    
    
    



    
    


// 生產者
jmsTemplate.convertAndSend("ORDER_QUEUE", orderDto);

// 消費者 (監聽器容器)

    

七、學習路線圖

  1. 掌握 JMS 1.1 核心接口流程 (Connection → Session → Producer/Consumer)
  2. 理解 Queue/Topic 語義差異,正確選型
  3. 實戰 ActiveMQ:安裝、Web Console、持久化配置、集群
  4. Spring JMS 整合:JmsTemplate、@JmsListener、事務管理
  5. 進階:消息確認機制、死信隊列、延遲隊列、優先級、流控
  6. JMS 2.0 新特性:JMSContext、共享訂閱、簡化 API
  7. 對比 Kafka/RabbitMQ/RocketMQ:架構差異、性能、一致性、生態

JMS 是企業級異步解耦基石。徹底搞懂「標準 vs 實現」、「Queue vs Topic」、「同步 vs 異步」、「事務 vs 確認」四對核心辯證關係,你就擁有了駕馭任何消息中間件的通用認知框架。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved