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

J2EE 非同步訊息機制(上):JMS 核心架構與用戶端開發

     編輯:Java 相關知識

前言

在分散式企業級應用程式中,非同步訊息機制用於有效協調各部分工作。J2EE 提供 JMS 與訊息驅動 Bean (Message-Driven Bean),實作應用程式各元件間非同步訊息傳遞。

一、什麼是訊息系統?

訊息系統允許分離、未耦合的應用程式間可靠地非同步通訊。企業應用需要非同步、非阻塞訊息傳遞。例如客戶端發送請求給伺服器後,不在乎是否馬上得到回應,無需等待伺服器處理,提交請求確保到達伺服器端後即可處理其他任務,極具效率。

訊息系統提供許多分散式物件運算模型沒有的優點:鼓勵生產者與消費者間「鬆耦合」,擁有高度交易處理能力。對消費者而言,不在乎誰產生訊息、生產者是否仍在網路上、訊息何時產生,允許建立動態、可靠、彈性的系統,整個子系統可修改而不影響其他部分。其他優點包括:高度可擴展性、易與其他系統整合、高度可靠性。因可靠性與可擴展性,廣泛用於工作流、網路管理、通訊服務、供應鏈管理等。Java 技術中透過 JMS 實作非同步訊息處理能力。JMS 最初設計為給傳統訊息導向中介軟體提供標準 Java 介面,現已有許多支援 JMS 的純 Java 產品。

訊息系統類型

  1. 發布/訂閱:支援事件驅動模型,生產者發布事件,消費者訂閱感興趣事件並使用。生產者將訊息與特定主題連結,訊息系統依消費者註冊興趣傳遞訊息。
  2. 點對點:訊息分發給單一消費者,維持「進入」訊息佇列。應用程式發送訊息到特定佇列,客戶端從佇列取得訊息。

二、JMS 簡介

JMS 目標:提供訊息系統客戶固定介面,與底層訊息提供者無關。客戶端應用程式可在不同機器、作業系統移植,並在不同訊息系統產品間轉移。JMS 客戶端建立於 Java 技術上,可使用 JDBC、JavaBeans、JNDI、JTA、J2SE/J2EE API 實作企業級應用服務程式。

1. JMS 物件模型

JMS 物件模型

圖 1 顯示 JMS 物件,用於提供 JMS 客戶端與服務提供者連線的物件。

  • ConnectionFactory:客戶端用來建立 Connection 的管理物件,建立時涉及授權與通訊建立,屬較大型物件。
  • Destination:封裝訊息目的地與服務提供者相關的位址、配置資訊。
  • Session:JMS 實體,支援交易處理與非同步訊息消費。封裝交易複雜性,提供單執行緒程式模式下的並行優點。Session、MessageProducer、MessageConsumer 不支援並行;ConnectionFactory、Destination、Connection 支援並行。
  • MessageProducer/MessageConsumer:由 Session 建立,用於發送/接收訊息。為確保訊息傳遞,JMS 服務提供者處理的訊息皆為 PERSISTENT 模式,使提供者出問題後訊息仍能保存。

2. JMS 應用程式開發

JMS 中的訊息

訊息由三部分組成:

  • MESSAGE HEADER:識別訊息,如判斷給定訊息是否為「訂閱者」。
  • PROPERTIES:應用程式相關、提供者相關、可選資訊。
  • BODY:訊息內容,支援多種格式:TextMessage(String 簡單封裝)、ObjectMessage(任意物件封裝,需支援序列化)等。

TextMessage

String 物件封裝,僅傳遞文字物件時很有用。假設許多訊息系統建立在 XML 上,TextMessage 可成為包裝容器。建立範例:

TextMessage message = session.createTextMessage();
message.setText("Hello, world!");

ObjectMessage

Java 物件封裝訊息。任何可序列化 Java 物件皆可用。若需在一個訊息封裝多個物件,可用 Collection 包含多個序列化物件。建立範例:

ObjectMessage message = session.createObjectMessage();
message.setObject(myObject);

建立 JMS 客戶端程式

典型 JMS 客戶端基本步驟:

  1. 建立到訊息系統提供者的連線
  2. 建立 Session,用於接收/發送訊息
  3. 建立 MessageProducer 與 MessageConsumer
  4. 完成上述步驟後,生產者建立並發布訊息到主題,消費者接收相關主題訊息
1. 建立 Connection
InitialContext jndiContext = new InitialContext();
TopicConnectionFactory topicConnectionFactory = (TopicConnectionFactory) jndiContext.lookup("TopicConnectionFactory");
Topic topic = (Topic) jndiContext.lookup(topicName);
TopicConnection topicConnection = topicConnectionFactory.createTopicConnection();
2. 建立 Session
TopicSession topicSession = topicConnection.createTopicSession(false, Session.AUTO_ACKNOWLEDGE);

兩個參數控制交易與訊息確認。

3. 定位 Topic
Topic weatherTopic = messaging.lookup("WeatherReport");
4. 啟動 Connection
topicConnection.start();

初始化步驟後訊息流禁止,防止初始化時不可預期行為。初始化結束必須啟動連線。

5. 建立訊息生產者
TopicPublisher publisher = session.createPublisher(weatherTopic);
TextMessage message = session.createTextMessage();
message.setText("ssss");
publisher.publish(message);
訊息消費者程式碼
topicConnection = topicConnectionFactory.createTopicConnection();
topicSession = topicConnection.createTopicSession(false, Session.AUTO_ACKNOWLEDGE);
topicSubscriber = topicSession.createSubscriber(topic);
topicListener = new MsgListener();
topicSubscriber.setMessageListener(topicListener);
topicConnection.start();
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved