ActiveMQ從入門到精通(一)

      在瞭解ActiveMQ使用之間,咱們先一塊兒來了解一下什麼是消息中間件?

                                          消息中間件(MOM)

  • MOM的基本功能:將信息以消息的形式,從一個應用程序傳輸到另外一個或者多個應用程序。
  • MOM主要特色html

  1. 消息異步接受:相似於手機短信的行爲,消息發送者不須要等待消息接受者的響應,減小軟件多系統集成的耦合度;java

  2. 消息可靠接受:確保消息在消息中間件可靠保存,只要接受方接受到消息後纔可刪除,多個消息也能夠組成原子事務;linux

 

                                          JMS的基本概念和模型

  • JMS是什麼?

               JMS是java message service,java消息服務,是javaEE的一個技術。web

  • JMS規範

               JMS定義了java中訪問消息中間件的接口,可是沒有實現,實現了JMS接口的消息中間件就稱爲JMS Provider,例如AvtiveMQ。spring

  • JMS provider    

               實現了JMS接口和規範的消息中間件。apache

  • JMS message

               JMS消息,JMS消息有如下三部分組成:windows

                     一、消息頭:每一個消息頭字段都有相應的getter和setter方法。安全

                     二、消息體:封裝具體的消息數據。服務器

                     三、消息屬性:若是須要除消息頭以外的值,那麼均可以使用消息屬性。網絡

  • JMS producer:消息生產者。
  • JMS consumer:消息消費者。

               消息的發送能夠採用如下兩種方式:

                    一、同步方式:經過調用的消費裏的receive方法從目的地顯式的提取消息,receive方法能夠一直阻塞到消息到達。

                    二、異步方式:客戶能夠爲消費者註冊一個消息監聽器,以定義在消息到達時所採起的動做。

  • JMS domains:消息傳遞域。

               JMS規範中定義了兩種消息傳遞域:點對點(point-to-point)消息傳遞域,和發佈/訂閱(publish/subscribe)消息傳遞域。

               一、點對點消息傳遞域的特色以下:

                    (1)、每一個消息只能有一個消費者,即每一個消息只能被其中一個消費者消費。

                    (2)、消息的生產者和消費者之間沒有時間上的相關性。不管消費者在生產者發送消息時是否處於運行狀態,它均可以提取消息。

        如下是點對點的模型圖:

                  

           (中間的就是隊列,client 1就是生產者,它向隊列中發送消息,client 2是消費者,它負責從隊列中提取消息,消息消費完成後,隊列中的消息就消失了)

                二、發佈/訂閱消息傳遞域的特色:

                     (1)、每一個消息能夠被多個消費者消費,前提是這些消息這已經對topic(主題進行了訂閱)。

                     (2)、消息的生產者和消費者之間有時間上的相關性,訂閱了該主題的消費者只能消費該主題發佈的消息,若是此時該消費者沒有設置消息持久化,且沒有在線,

                       而主題已經完成了消息發佈,那麼該消費者不會收到那主題發佈的消息。

          如下是發佈/訂閱的模型圖:

             

               (topic爲主題,client 1爲生產者,它負責向主題發佈消息,client 2和client 3均爲訂閱了該主題的消費者,但client 1發送消息,且client 2和3都在線,那麼將能夠收到消息)

  • JMS中相關對象
  1. Connection Factory:JMS的鏈接工廠,ActiveMQ經過new ActiveMQConnectFactory("tcp:部署activemq服務器ip:61616");
  2. JMS Conection:JMS鏈接。經過鏈接工廠建立鏈接。
  3. JMS Session:是生產者和消費者消息的一個單線程上下文。用於建立生產者(session.createProducer(destination)、session.createProducer(destination,selector)方法建立,第二種方法後續會講解。)、建立消費者(session.createConsumer(destination))、建立消息。
  4. Destination:消息發送到的目的地(爲字符串)。
  5. Acknowledge:簽收。在建立session時設置是否簽收。connection.createSession(Session.CLIENT_ACKNOWLEDGE);
  6. Trancsaction:事務。在建立session時設置是否開啓事務。connection.createSession(Boolean.TRUE)--表示開啓。

                                         JMS的消息結構

  • JMS的消息由三部分組成:消息頭、消息體、消息屬性。
  • 消息頭包含了消息的識別信息和路由信息。
  • 消息頭包含的一些標準的屬性以下
  1. JMSDestinaction:消息發送的目的地,主要是queue和topic,自動分配。
  2. JMSDeliveryMode:傳送模式。有兩種:持久化和非持久化。自動分配。
  3. JMSExpiration:消息過時時間。等於Destination的send方法中的timeToLive值加上發送時刻的GET時間值,若是timeToLive值等於0,則JMSExpiration被設置爲0,表示永不過時。若是發送後,在消費過時時間以後消息尚未被消費,那麼消息就會消失。自動分配。
  4. JMSPriority:消息優先級。從0-9 十個級別,0-4是普通消息,5-9是加急消息,默認是4級。自動分配。
  5. JMSMessageID:惟一識別每一個消息的標識,由JMS Provider產生, 自動分配。
  6. JMSTimestamp:JMS時間戳。一個JMS Provider在調用send()方法時自動設置,它是消息被髮送和消費者實際接收的時間差,自動分配。
  7. JMSReplyTo:JMS消息回覆,要求生產者發送消息,消費者消費消息後回覆生產者消息已經被消費。
  8. JMSType:JMS消息類型。(TextMessage  主體包含字符串、BytesMessage  主體包含連續字節流、MapMessage  主體包含鍵值對、StreamMessage主體包含流、ObjectMessage  主體包含對象)
  9. JMSRedelivered:JMS消息重遞,即消息已經發送出去,可是消費者收到消息,但未簽收(acknowledged)可設置該模式,讓消息重遞。

 

  • 消息體:JMS API定義了5中消息體格式,也叫消息類型,可使用不一樣形式發送接口數據。包括:TextMessage、BytesMessage、ObjectMessage、MapMessage、StreamMessage。
  • 消息屬性,包括如下三種類型的屬性:
  1. 應用程序設置和添加的屬性,好比:

                    message.setProperty("username",username);

                    message.getProperty("username");等。

    2.JMS定義的屬性

                    使用「JMSX」做爲屬性名的前綴,經過connection.getMetaData().getJMSXPropertyNames();方法返回全部鏈接支持JMSX的屬性名字。

    3.JMS定義的屬性以下:

           1)、JMSXUserID:發送消息的用戶標識,發送時提供商設置。

           2)、JMSXAppID:發送消息的應用標識,發送時提供商設置。

           3)、JMSXDeliveryCount:轉發消息重試次數,第一次是1,第二次是2...,依次類推,發送時提供商設置。

           4)、JMSXGroupID:消息所在消息組的標識,由客戶端設置。

           5)、JMSXGroupSeq:組內消息的序號,第一是1,第二是2....依此類推,由客戶端設置。

           6)、JMSXProducerTXID:產生消息是事務的事務標識,發送時提供商設置。

           7)、JMSXConsumerTXID:消費消息的事務的事務標識,接收時提供商設置。

           8)、JMSXState:消息狀態,1(等待)、2(準備)、3(到期)、4(保留)。

 

                                         

                                         ActiveMQ簡介

  • ActiveMQ是什麼

                ActiveMQ是有Apache推出的,一款開源的、徹底支持JMS1.1和J2EE1.4規範的JMS Provider實現的消息中間件(Message Oriented Middleware, MOM)

  • ActiveMQ能幹什麼

                最主要的功能就是:實現了JMS Provider,用來幫助實現高可用、高性能、易用、可伸縮和安全的企業級面向消息服務的系統。

  • ActiveMQ的優勢
  1. 徹底支持JMS1.1和J2EE1.4規範(持久化,XA消息,事務);
  2. 支持多種傳輸協議:in-VM、TCP、NIO、UDP、JGroups、JXTA;
  3. 很容易和Application Server集成使用
  4. 很容易和spring進行整合;
  5. 支持經過JDBC和journal提供高速的消息持久化;
  6. 支持Axis的整合;

                                      ActiveMQ安裝和基本使用

  • 下載並安裝ActiveMQ服務器端
  1. http://activemq.apache.org/download.html下載最新版本的ActiveMQ
  2. 直接解壓,而後拷貝到你要安裝的目錄便可。
  3. 解壓後目錄結構以下:

             

    bin (windows下面的bat和unix/linux下面的sh) 啓動ActiveMQ的啓動服務就在這裏

    conf (activeMQ配置目錄,包含最基本的activeMQ配置文件)

    data (默認是空的)

    docs (index,replease版本里面沒有文檔)

    example (幾個例子)

    lib (activeMQ使用到的lib)

    webapps (系統管理員控制檯代碼)

    webapps-demo(系統示例代碼)

    activemq-all-5.8.0.jar (ActiveMQ的binary)

    user-guide.html (部署指引)

    LICENSE.txt

    NOTICE.txt

    README.txt

  • 啓動運行
  1. 普通啓動;到ActiveMQ/bin下面,使用命令:./activemq start
  2. 啓動並指定日誌文件,使用命令:./activemq start > /tmp/activemqlog
  • 檢查是否已經啓動

                activemq默認採用61616端口提供JMS服務,採用8161端口提供管理控制檯服務,執行如下命令以便檢驗是否已經成功啓動activemq服務:

  1. 好比查看61616端口是否打開:netstat -an | grep 61616
  2. 也能夠查看控制檯輸出或者日誌文件;
  3. 還能夠直接訪問activemq的管理頁面:http://ip:8161/admin/(ip爲部署activemq的服務器ip),默認管理頁面登陸帳號和密碼都爲admin;(注意,若是activemq的管理頁面沒法打開,多是防火牆沒有開閉,使用命令:systemctl status firewalld.service
    查看防火牆狀態,若是顯示「Avtive:active (running) since Thu...」的字段表示防火牆狀態在運行,使用命令:systemctl stop firewalld.service關閉防火牆便可。)
  • 啓動成功 

        能夠訪問管理員界面:http://localhost:8161/admin,默認用戶名和密碼admin/admin。若是你想修改用戶名和密碼的話,在conf/jetty-realm.properties中修改便可。

           

         其中在導航菜單中,Queues是隊列方式消息。Topics是主題方式消息。Subscribers消息訂閱監控查詢。Connections能夠查看連接數,分別能夠查看xmpp、ssl、stomp、openwire、ws和網絡連接。Network是網絡連接數監控。Send能夠發送消息數據。

  • 關閉activemq服務
  1. 可使用命令:./activemq stop
  2. 或者使用命令:ps -ef | grep activemq,獲得activemq的進程數,而後使用命令:kill -9 進程數來殺死進程。 

                                      ActiveMQ消息形式

 

一、ActiviteMQ消息有3種形式:

JMS 公共

點對點域

發佈/訂閱域

ConnectionFactory

QueueConnectionFactory

TopicConnectionFactory

Connection

QueueConnection

TopicConnection

Destination

Queue

Topic

Session

QueueSession

TopicSession

MessageProducer

QueueSender

TopicPublisher

MessageConsumer

QueueReceiver

TopicSubscriber

(1)、點對點方式(point-to-point)

        點對點的消息發送方式主要創建在 Message Queue,Sender,reciever上,Message Queue 存貯消息,Sneder 發送消息,receive接收消息.具體點就是Sender Client發送Message Queue ,而 receiver Cliernt從Queue中接收消息和"發送消息已接受"到Quere,確認消息接收。消息發送客戶端與接收客戶端沒有時間上的依賴,發送客戶端能夠在任什麼時候刻發送信息到Queue,而不須要知道接收客戶端是否是在運行

(2)、發佈/訂閱 方式(publish/subscriber Messaging)

        發佈/訂閱方式用於多接收客戶端的方式.做爲發佈訂閱的方式,可能存在多個接收客戶端,而且接收端客戶端與發送客戶端存在時間上的依賴。一個接收端只能接收他建立之後發送客戶端發送的信息。做爲subscriber ,在接收消息時有兩種方法,destination的receive方法,和實現message listener 接口的onMessage 方法。

                                      ActiveMQ接收和發送信息基本流程

  • 流程圖

            

發送消息的基本步驟:

(1)、建立鏈接使用的工廠類JMS ConnectionFactory

(2)、使用管理對象JMS ConnectionFactory創建鏈接Connection,並啓動

(3)、使用鏈接Connection 創建會話Session

(4)、使用會話Session和管理對象Destination建立消息生產者MessageSender

(5)、使用消息生產者MessageSender發送消息

 

消息接收者從JMS接受消息的步驟

(1)、建立鏈接使用的工廠類JMS ConnectionFactory

(2)、使用管理對象JMS ConnectionFactory創建鏈接Connection,並啓動

(3)、使用鏈接Connection 創建會話Session

(4)、使用會話Session和管理對象Destination建立消息接收者MessageReceiver

(5)、使用消息接收者MessageReceiver接受消息,須要用setMessageListener將MessageListener接口綁定到MessageReceiver消息接收者必須實現了MessageListener接口,須要定義onMessage事件方法。  

相關文章
相關標籤/搜索