【轉載】JAVA消息服務JMS規範及原理詳解

轉載:https://www.cnblogs.com/molao-doing/articles/6557305.htmlhtml

做者: moyun-java

1、簡介

JMS即Java消息服務(Java Message Service)應用程序接口,是一個Java平臺中關於面向消息中間件(MOM)的API,用於在兩個應用程序之間,或分佈式系統中發送消息,進行異步通訊。Java消息服務是一個與具體平臺無關的API,絕大多數MOM提供商都對JMS提供支持。服務器

JMS容許應用程序組件基於JavaEE平臺建立、發送、接收和讀取消息。它使分佈式通訊耦合度更低,消息服務更加可靠以及異步性。session

 

2、經常使用術語介紹

  在提到JMS時,咱們一般會說到一些術語,解釋以下:數據結構

  1. 消息中間件(JMS Provider) : 指提供了對JMS協議的第三方組件,好比ActiveMQ就是一個消息中間件,另外比較知名的還有KFA, Rabbit MQ等。
  2. 消息模式:分爲點對點(Point to Point,即P2P)和發佈/訂閱(Pub/Sub),對應的數據結構分別是隊列(Queue)和主題(Topic)
  3. 消息(Message): 通訊內容的載體,其結構主要分爲消息頭,屬性和消息體,而且根據存儲結構的不一樣分爲好幾種,後面會詳細提到。
  4. 消息生產者:產生消息的一方,在P2P模式下,指消息發送者(Sender),在P/S模式下指消息發佈者(Publisher)
  5. 消息消費者:接收消息的一方,對應於兩種模式分別是消息接收者(Receiver)和消息訂閱者(Subscriber)                          

3、JMS基本概念及原理詳解

一、基本概念  

  JMS是java的消息服務,JMS的客戶端之間能夠經過JMS服務進行異步的消息傳輸。架構

二、體系架構

  JMS由如下元素組成。併發

.  1.JMS提供者 異步

  鏈接面向消息中間件的,JMS接口的一個實現。提供者能夠是Java平臺的JMS實現,也能夠是非Java平臺的面向消息中間件的適配器。socket

  2.JMS客戶 分佈式

  生產或消費消息的基於Java的應用程序或對象。

  3.JMS生產者 
  建立併發送消息的JMS客戶。

  4.JMS消費者 
  接收消息的JMS客戶。

  5.JMS消息 
  包括能夠在JMS客戶之間傳遞的數據的對象

  6.JMS隊列 
  一個容納那些被髮送的等待閱讀的消息的區域。隊列暗示,這些消息將按照順序發送。一旦一個消息被閱讀,該消息將被從隊列中移走。

  7.JMS主題 
  一種支持發送消息給多個訂閱者的機制。


三、JMS消息模型(即點對點和發佈訂閱模型)

    一、Point-to-Point(P2P)

    二、Publish/Subscribe(Pub/Sub)

四、P2P  

  一、P2P模式圖效果
      


  二、涉及到的概念

    2.一、消息隊列(Queue)
    2.二、提供者(Sender)
    2.三、消費者(Receiver)
    2.四、每一個消息都被髮送到一個特定的隊列,接收者從隊列中獲取消息。隊列保留着消息,直到他們被消費或超時。

  三、P2P的特色    

    3.一、每一個消息只有一個消費者(Consumer)(即一旦被消費,消息就再也不在消息隊列中)
    3.二、提供者和消費者之間在時間上沒有依賴性,也就是說當提供者發送了消息以後,無論消費者有沒有正在運行,它不會影響到消息被髮送到隊列
    3.三、每條消息僅會傳送給一個消費者。可能會有多個消費者在一個隊列中偵聽,可是每一個隊列中的消息只能被隊列中的一個消費者所消費。
    3.四、消息存在前後順序。一個隊列會按照消息服務器將消息放入隊列中的順序,把它們傳送給消費者。當已被消費時,就會從隊列頭部將它們刪除(除非使用了消息優先級)。
    3.五、消費者在成功接收消息以後需向隊列應答成功
    PS:若是你但願發送的每一個消息都應該被成功處理的話,那麼你須要P2P模式。

五、Pub/Sub(發佈/訂閱模式)    

  一、Pub/Sub模式效果圖

 


  二、涉及到的概念

    2.一、主題(Topic)
    2.二、發佈者(Publisher)
    2.三、訂閱者(Subscriber)

    PS:客戶端將消息發送到主題。多個發佈者將消息發送到Topic,系統將這些消息傳遞給多個訂閱者。
  
  三、Pub/Sub(發佈/訂閱模式)的特色

    3.一、每一個消息能夠有多個消費者
    3.二、發佈者和訂閱者之間有時間上的依賴性。針對某個主題的訂閱者,它必須建立一個訂閱者以後,才能消費發佈者的消息,並且爲了消費消息,訂閱者必須保持運行的狀態。
    3.三、爲了緩和這樣嚴格的時間相關性,JMS容許訂閱者建立一個可持久化的訂閱。這樣,即便訂閱者沒有被激活(運行),它也能接收到發佈者的消息。
    3.四、每條消息都會傳送給稱爲訂閱者的多個消息消費者。訂閱者有許多類型,包括持久型、非持久型和動態型。
    3.五、發佈者一般不會知道、也意識不到哪個訂閱者正在接收主題消息。
    3.六、消息被推送給消費者,這意味着消息會傳送給消費者,而無須請求。

    PS:若是你但願發送的消息能夠不被作任何處理、或者被一個消息者處理、或者能夠被多個消費者處理的話,那麼能夠採用Pub/Sub模型

六、關於消息的消費  

  在JMS中,消息的產生和消息是異步的。對於消費來講,JMS的消息者能夠經過兩種方式來消費消息。  

  6.一、同步

    訂閱者或消費者調用receive方法來接收消息,receive方法在可以接收到消息以前(或超時以前)將一直阻塞

  6.二、異步

    訂閱者或消費者能夠註冊爲一個消息監聽器。當消息到達以後,系統自動調用監聽器的onMessage方法。

 

七、JMS應用程序接口

  7.一、ConnectionFactory 接口(鏈接工廠)
    建立Connection對象的工廠,根據消息類型的不一樣,用戶將使用隊列鏈接工廠,或者主題鏈接工廠分,
    別有QueueConnectionFactory和TopicConnectionFactory兩種。能夠經過JNDI來查找ConnectionFactory對象。
  
  7.二、Destination 接口(目標)
    Destination是一個包裝了消息目標標識符的被管對象,消息目標是指消息發佈和接收的地點,或者是隊列,或者是主題。
    是消息生產者的消息發送目標或者說消息消費者的消息來源。對於消息生產者來講,它的Destination是某個隊列(Queue)或某個主題(Topic);
    對於消息消費者來講,它的Destination也是某個隊列或主題(即消息來源)。
    因此,Destination實際上就是兩種類型的對象:Queue、Topic能夠經過JNDI來查找Destination。


  7.三、Connection 接口(鏈接)
    Connection表示在客戶端和JMS系統之間創建的連接(對TCP/IP socket的包裝)。
    Connection能夠產生一個或多個Session。跟ConnectionFactory同樣,Connection也有兩種類型:QueueConnection和TopicConnection。

  7.四、Session 接口(會話)
    Session是咱們操做消息的接口。表示一個單線程的上下文,用於發送和接收消息。
    因爲會話是單線程的,因此消息是連續的,就是說消息是按照發送的順序一個一個接收的。
    能夠經過session建立生產者、消費者、消息等。Session提供了事務的功能。當咱們須要使用session發送/接收多個消息時,能夠將這些發送/接收動做放到一個事務中。
    一樣,也分QueueSession和TopicSession。

  7.五、MessageProducer 接口(消息的生產者)
    消息生產者由Session建立,並用於將消息發送到Destination。消費者能夠同步地(阻塞模式),或異步(非阻塞)接收隊列和主題類型的消息。
    一樣,消息生產者分兩種類型:QueueSender和TopicPublisher。能夠調用消息生產者的方法(send或publish方法)發送消息。


  7.六、MessageConsumer 接口(消息消費者)
    消息消費者由Session建立,用於接收被髮送到Destination的消息。兩種類型:QueueReceiver和TopicSubscriber。
    可分別經過session的createReceiver(Queue)或createSubscriber(Topic)來建立。
    固然,也能夠session的creatDurableSubscriber方法來建立持久化的訂閱者。


  7.七、Message 接口(消息)
    是在消費者和生產者之間傳送的對象,也就是說從一個應用程序創送到另外一個應用程序。一個消息有三個主要部分:
    一、消息頭(必須):包含用於識別和爲消息尋找路由的操做設置。
    二、一組消息屬性(可選):包含額外的屬性,支持其餘提供者和用戶的兼容。能夠建立定製的字段和過濾器(消息選擇器)。
    三、一個消息體(可選):容許用戶建立五種類型的消息(文本消息,映射消息,字節消息,流消息和對象消息)。消息接口很是靈活,並提供了許多方式來定製消息的內容。

    消息接口很是靈活,並提供了許多方式來定製消息的內容。

  7.八、MessageListener
    消息監聽器。若是註冊了消息監聽器,一旦消息到達,將自動調用監聽器的onMessage方法。
    EJB中的MDB(Message-Driven Bean)就是一種MessageListener。

4、JMS提供者實現

  要使用Java消息服務,你必需要有一個JMS提供者,管理會話和隊列。如今既有開源的提供者也有專有的提供者。  開源的提供者包括:Apache ActiveMQ、Kafka、WebMethods、阿里的RocketMQ等

相關文章
相關標籤/搜索