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

JMS 客戶端編程模型全解析:PTP/ Pub-Sub、統一 API、ActiveMQ 實戰 Demo

     編輯:Java 綜合教學

JMS 客戶端編程模型全解析:PTP/ Pub-Sub、統一 API、ActiveMQ 實戰 Demo

核心概念

  • MOM 四大元素:Provider(消息中間件)、Destination(隊列/主題)、Client(生產者/消費者)、Message
  • 兩大傳遞模式:
    • PTP (Point-to-Point):Queue,一條消息僅被一個消費者消費
    • Pub/Sub (Publish/Subscribe):Topic,一條消息廣播給所有訂閱者

PTP模型 PubSub模型 角色定位

JMS API 體系演進

層級PTP 接口Pub/Sub 接口統一域接口 (JMS 1.1+)
ConnectionFactoryQueueConnectionFactoryTopicConnectionFactoryConnectionFactory
ConnectionQueueConnectionTopicConnectionConnection
SessionQueueSessionTopicSessionSession
DestinationQueueTopicDestination
ProducerQueueSenderTopicPublisherMessageProducer
ConsumerQueueReceiverTopicSubscriberMessageConsumer

API對比表

統一編程模型六步走

編程模型流程圖

  1. JNDI 查找 ConnectionFactory 與 Destination(受管對象,不建議 new)
  2. 創建 Connection → 分配通信資源、認證
  3. 創建 Session → 單線程上下文,事務與確認模式控制
  4. 創建 MessageProducer / MessageConsumer
  5. 發送 / 接收 Message(Header + Properties + Body)
  6. 關閉資源(Connection 必須 close)

核心對象速查

  • ConnectionFactory:創建 Connection 的工廠
  • Connection:客戶端與 Broker 的活躍連接,支援並發共享
  • Session:生產消息、Producer、Consumer 的工廠
  • Message:Header(路由/屬性) + Properties(應用屬性) + Body(載荷)
  • Destination:Queue 或 Topic,由 Provider 管理

實戰 Demo:ActiveMQ 5.13.2 + Maven

環境準備

# 下載解壓 ActiveMQ
bin/activemq start
# 訪問 https://localhost:8161/admin (admin/admin) 驗證

Producer 客戶端

// pom.xml 依賴

    org.apache.activemq
    activemq-client
    5.13.2


    org.slf4j
    slf4j-simple
    1.7.19

// jndi.properties
java.naming.factory.initial=org.apache.activemq.jndi.ActiveMQInitialContextFactory
java.naming.provider.url=tcp://localhost:61616
queue.exampleQueue=example.queue
topic.exampleTopic=example.topic
// SimpleProducer.java (PTP 模式)
Context ctx = new InitialContext();
ConnectionFactory cf = (ConnectionFactory) ctx.lookup("ConnectionFactory");
Destination queue = (Destination) ctx.lookup("exampleQueue");

Connection conn = cf.createConnection();
Session session = conn.createSession(false, Session.AUTO_ACKNOWLEDGE);
MessageProducer producer = session.createProducer(queue);

for (int i=1; i<=3; i++) {
    TextMessage msg = session.createTextMessage("This is the " + i + "th message.");
    producer.send(msg);
}
session.close(); conn.close();

Consumer 客戶端

// SimpleConsumer.java
Connection conn = cf.createConnection();
conn.start(); // 關鍵:必須 start() 才能接收消息
Session session = conn.createSession(false, Session.AUTO_ACKNOWLEDGE);
MessageConsumer consumer = session.createConsumer(queue);

long timeout = 10_000;
for (Message msg = consumer.receive(timeout); msg != null; msg = consumer.receive(timeout)) {
    System.out.println("Received: " + ((TextMessage)msg).getText());
}
session.close(); conn.close();

編程式創建對象(不推薦生產使用)


ConnectionFactory cf = new ActiveMQConnectionFactory(
    ActiveMQConnectionFactory.DEFAULT_USER,
    ActiveMQConnectionFactory.DEFAULT_PASSWORD,
    ActiveMQConnectionFactory.DEFAULT_BROKER_URL);
Destination queue = session.createQueue("example.queue");
Destination topic = session.createTopic("example.topic");

測試驗證

  1. 啟動 ActiveMQ
  2. 運行 Producer → ActiveMQ Console 看到 Queue 消息數 +3
  3. 運行 Consumer → 控制台打印 3 條消息
  4. 修改 JNDI lookup 為 Topic,驗證 Pub/Sub 模式

參考資源

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