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

JMS 異步消息傳遞核心模式與代碼實戰

     編輯:Java 相關知識

JMS 核心優勢

Java Message Service (JMS) 實現異步消息傳遞,極大簡化企業級異步通訊系統開發,消息模式保持系統鬆散耦合。

兩大消息模型

1. 點對點 (P2P, Queue)

  • 消息發送至特定隊列,單一接收者消費。
  • 發送者與接收者生命週期無綁定關係。

2. 發布/訂閱 (Pub/Sub, Topic)

  • 消息發送至主題,多個訂閱者同時接收。
  • 訂閱者需處於活躍狀態才能收到消息(除非使用持久訂閱)。

支援的消息類型

  • TextMessage - 字串
  • MapMessage - 鍵值對
  • BytesMessage - 位元組流
  • StreamMessage - Java 基本類型流
  • ObjectMessage - 可序列化物件

P2P 完整代碼範例

Sender

Context ctx = new InitialContext();
QueueConnectionFactory factory = (QueueConnectionFactory) ctx.lookup("QueueConnectionFactoryTest");
QueueConnection conn = factory.createQueueConnection();
QueueSession session = conn.createQueueSession(false, Session.AUTO_ACKNOWLEDGE);
Queue queue = (Queue) ctx.lookup("QueueTest");
QueueSender sender = session.createSender(queue);
TextMessage msg = session.createTextMessage("Hello JMS!");
sender.send(msg);
conn.close();

Receiver

Context ctx = new InitialContext();
QueueConnectionFactory factory = (QueueConnectionFactory) ctx.lookup("QueueConnectionFactoryTest");
QueueConnection conn = factory.createQueueConnection();
QueueSession session = conn.createQueueSession(false, Session.AUTO_ACKNOWLEDGE);
Queue queue = (Queue) ctx.lookup("QueueTest");
QueueReceiver receiver = session.createReceiver(queue);
conn.start();
while (true) {
    Message m = receiver.receive();
    if (m instanceof TextMessage) {
        System.out.println("Reading: " + ((TextMessage)m).getText());
    } else break;
}
conn.close();

Pub/Sub 代碼範例

Publisher

TopicConnectionFactory factory = (TopicConnectionFactory) ctx.lookup("TopicConnectionFactoryTest");
TopicConnection conn = factory.createTopicConnection();
TopicSession session = conn.createTopicSession(false, Session.AUTO_ACKNOWLEDGE);
Topic topic = (Topic) ctx.lookup("TopicTest");
TopicPublisher publisher = session.createPublisher(topic);
TextMessage msg = session.createTextMessage("Message " + i);
publisher.publish(msg);
conn.close();

Subscriber

TopicConnectionFactory factory = (TopicConnectionFactory) ctx.lookup("TopicConnectionFactoryTest");
TopicConnection conn = factory.createTopicConnection();
TopicSession session = conn.createTopicSession(false, Session.AUTO_ACKNOWLEDGE);
Topic topic = (Topic) ctx.lookup("TopicTest");
TopicSubscriber subscriber = session.createSubscriber(topic, null, true); // true = noLocal
conn.start();
TextMessage msg = (TextMessage) subscriber.receive();
System.out.println("Received: " + msg.getText());
conn.close();

共同模式總結

  1. 透過 ConnectionFactory 建立 Connection。
  2. Connection 建立 Session。
  3. Session 建立發送者/接收者,綁定 Destination (Queue/Topic)。
  4. 發送端使用 send/publish,接收端使用 receive/receiveNoWait(繼承自 MessageConsumer)。

進階應用

  • 獨立客戶端需在 Application Server 配置 JNDI 資源(參考《Standalone Client Lookup JNDI from GlassFish》)。
  • 可採用 Message Driven Bean (MDB) 作為接收端,EJB 容器自動調用 onMessage,更符合 J2EE 規範。
  • 主流 Provider:ActiveMQ、RabbitMQ、IBM MQ 等,提供叢集、持久化、監控等企業級特性。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved