天天看點

ActiveMQ深入淺出(一)——JMS基本概念

摘要:The Java Message Service (JMS) API is a messaging standard that allows application components based on the javaPlatform Enterprise Edition (Java EE) to create, send, receive, and read messages. It enables distributed communication that is loosely coupled, reliable, and asynchronous.

JMS(Java Message Service,java消息服務)API是一個消息服務的标準或者說是規範,允許應用程式元件基于JavaEE平台建立、發送、接收和讀取消息。它使分布式通信耦合度更低,消息服務更加可靠以及異步性。

這篇博文我們主要介紹J2EE中的一個重要規範JMS,因為這個規範在企業中的應用十分的廣泛,也比較重要,我們主要介紹JMS的基本概念和它的模式,消息的消費以及JMS程式設計步驟。

  1. 基本概念

    JMS是java的消息服務,JMS的用戶端之間可以通過JMS服務進行異步的消息傳輸。

  2. 消息模型
    ○ Point-to-Point(P2P)
    ○ Publish/Subscribe(Pub/Sub)
               
    即點對點和釋出訂閱模型
  3. P2P
    1. P2P模式圖 
      ActiveMQ深入淺出(一)——JMS基本概念
    2. 涉及到的概念 
      1. 消息隊列(Queue)
      2. 發送者(Sender)
      3. 接收者(Receiver)
      4. 每個消息都被發送到一個特定的隊列,接收者從隊列中擷取消息。隊列保留着消息,直到他們被消費或逾時。
    3. P2P的特點
      1. 每個消息隻有一個消費者(Consumer)(即一旦被消費,消息就不再在消息隊列中)
      2. 發送者和接收者之間在時間上沒有依賴性,也就是說當發送者發送了消息之後,不管接收者有沒有正在運作,它不會影響到消息被發送到隊列
      3. 接收者在成功接收消息之後需向隊列應答成功
      如果你希望發送的每個消息都應該被成功處理的話,那麼你需要P2P模式。
  4. Pub/Sub
    1. Pub/Sub模式圖 
      ActiveMQ深入淺出(一)——JMS基本概念
    2. 涉及到的概念 
      1. 主題(Topic)
      2. 釋出者(Publisher)
      3. 訂閱者(Subscriber) 

        用戶端将消息發送到主題。多個釋出者将消息發送到Topic,系統将這些消息傳遞給多個訂閱者。

    3. Pub/Sub的特點
      1. 每個消息可以有多個消費者
      2. 釋出者和訂閱者之間有時間上的依賴性。針對某個主題(Topic)的訂閱者,它必須建立一個訂閱者之後,才能消費釋出者的消息,而且為了消費消息,訂閱者必須保持運作的狀态。
      3. 為了緩和這樣嚴格的時間相關性,JMS允許訂閱者建立一個可持久化的訂閱。這樣,即使訂閱者沒有被激活(運作),它也能接收到釋出者的消息。
      如果你希望發送的消息可以不被做任何處理、或者被一個消息者處理、或者可以被多個消費者處理的話,那麼可以采用Pub/Sub模型
  5. 消息的消費 

    在JMS中,消息的産生和消息是異步的。對于消費來說,JMS的消息者可以通過兩種方式來消費消息。 

    ○ 同步 

    訂閱者或接收者調用receive方法來接收消息,receive方法在能夠接收到消息之前(或逾時之前)将一直阻塞 

    ○ 異步 

    訂閱者或接收者可以注冊為一個消息監聽器。當消息到達之後,系統自動調用監聽器的onMessage方法。

  6. JMS程式設計模型

    (1) ConnectionFactory

    建立Connection對象的工廠,針對兩種不同的jms消息模型,分别有QueueConnectionFactory和TopicConnectionFactory兩種。可以通過JNDI來查找ConnectionFactory對象。

    (2) Destination

    Destination的意思是消息生産者的消息發送目标或者說消息消費者的消息來源。對于消息生産者來說,它的Destination是某個隊列(Queue)或某個主題(Topic);對于消息消費者來說,它的Destination也是某個隊列或主題(即消息來源)。

    是以,Destination實際上就是兩種類型的對象:Queue、Topic可以通過JNDI來查找Destination。

    (3) Connection

    Connection表示在用戶端和JMS系統之間建立的連結(對TCP/IP socket的包裝)。Connection可以産生一個或多個Session。跟ConnectionFactory一樣,Connection也有兩種類型:QueueConnection和TopicConnection。

    (4) Session

    Session是我們操作消息的接口。可以通過session建立生産者、消費者、消息等。Session提供了事務的功能。當我們需要使用session發送/接收多個消息時,可以将這些發送/接收動作放到一個事務中。同樣,也分QueueSession和TopicSession。

    (5) 消息的生産者

    消息生産者由Session建立,并用于将消息發送到Destination。同樣,消息生産者分兩種類型:QueueSender和TopicPublisher。可以調用消息生産者的方法(send或publish方法)發送消息。

    (6) 消息消費者

    消息消費者由Session建立,用于接收被發送到Destination的消息。兩種類型:QueueReceiver和TopicSubscriber。可分别通過session的createReceiver(Queue)或createSubscriber(Topic)來建立。當然,也可以session的creatDurableSubscriber方法來建立持久化的訂閱者。

    (7) MessageListener

    消息監聽器。如果注冊了消息監聽器,一旦消息到達,将自動調用監聽器的onMessage方法。EJB中的MDB(Message-Driven Bean)就是一種MessageListener。

  7. 企業消息系統的好處

我們先來看看下圖,應用程式A将Message發送到伺服器上,然後應用程式B從伺服器中接收A發來的消息,通過這個圖我們一起來分析一下JMS的好處: 

ActiveMQ深入淺出(一)——JMS基本概念
  1. 提供消息靈活性
  2. 松散耦合
  3. 異步性

對于JMS的基本概念我們就介紹這麼多,下篇博文介紹一種JMS的實作。