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

JMS 消息傳遞系統構建指南:核心模型、API 與實戰代碼

     編輯:Java 相關知識

JMS 核心概念

JMS (Java Message Service) 是 Java EE 標準消息交換 API,支援異步、可靠、松耦合的分布式通信。核心組件:

  • ConnectionFactory:創建連接的工廠(Queue/Topic 兩種)。
  • Destination:Queue(點對點)或 Topic(發布/訂閱)。
  • Connection:客戶端與 Broker 的 TCP 連接,需 start() 啟動接收。
  • Session:單線程上下文,創建生產者/消費者,管理事務/確認模式。
  • MessageProducer/Consumer:發送/接收消息。
  • Message:Header + Properties(可選)+ Body(可選,Text/Bytes/Map/Object/Stream)。

兩大消息模型

模型核心概念特點
點對點 (P2P)Queue一條消息僅一個消費者;多消費者競爭;FIFO;發送者無需知曉接收者
發布/訂閱 (Pub/Sub)Topic一條消息多個訂閱者收到;基於主題;不保證順序;適合廣播

JMS 規範不強制提供者同時實現兩種模型,但主流產品(IBM MQSeries, WebLogic, SonicMQ, ActiveMQ 等)均雙支援。

EJB 2.0 整合:Message-Driven Bean (MDB)

MDB 實現 MessageDrivenBean + MessageListener,無 Remote Interface,僅通過消息交互。容器自動管理生命周期與實例池。缺點:單 MDB 僅能監聽一個 Destination。

實戰代碼:基於 JBoss 的隊列收發

發送端

public class SimpleSender {
    public static void main(String[] args) { new SimpleSender(); }
    public SimpleSender() {
        try {
            Properties props = new Properties();
            props.put(Context.INITIAL_CONTEXT_FACTORY, "org.jnp.interfaces.NamingContextFactory");
            props.put(Context.URL_PKG_PREFIXES, "org.jnp.interfaces");
            props.put(Context.PROVIDER_URL, "localhost");
            Context ctx = new InitialContext(props);
            QueueConnectionFactory factory = (QueueConnectionFactory) ctx.lookup("UIL2ConnectionFactory");
            Queue queue = (Queue) ctx.lookup("queue/testQueue");
            QueueConnection conn = factory.createQueueConnection();
            QueueSession session = conn.createQueueSession(false, Session.AUTO_ACKNOWLEDGE);
            TextMessage msg = session.createTextMessage();
            QueueSender sender = session.createSender(queue);
            conn.start();
            for (int i=0; i<10; i++) {
                msg.setText("Hello World #" + i);
                sender.send(msg);
            }
            conn.close(); ctx.close();
        } catch (Exception e) { e.printStackTrace(); }
    }
}

同步接收端

public class SyncReceiver {
    public static void main(String[] args) { new SyncReceiver(); }
    public SyncReceiver() {
        try {
            // JNDI 查找同上...
            QueueReceiver receiver = session.createReceiver(queue);
            conn.start();
            for (int i=0; i<10; i++) {
                TextMessage msg = (TextMessage) receiver.receive(); // 阻塞等待
                System.out.println("Got: " + msg.getText());
            }
            conn.close(); ctx.close();
        } catch (Exception e) { e.printStackTrace(); }
    }
}

異步接收端

實現 MessageListener,重寫 onMessage(Message msg),註冊 consumer.setMessageListener(listener),容器自動回調。

為什麼選擇 JMS 而非數據庫輪詢?

  • 數據庫輪詢:高頻查詢導致服務器/網絡負載大,多數查詢無結果,延遲高。
  • JMS 異步事件驅動:即時響應,解耦生產/消費,天然支援負載均衡與容錯。

典型應用:工作流、訂單處理、金融交易、即時通知系統。

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