ActiveMQ安裝與使用總結

1. 安裝準備
下載ActiveMQ:http://activemq.apache.org/
安裝(後臺服務啓動):
bin\win64\InstallService.bat 雙擊安裝即可,如果有殺毒軟件的話先關閉殺毒軟件
默認端口61616,安裝過程中如果有端口占用的情況,先找到佔用端口的進程然後關閉掉。
查找進程的操作:cmd->輸入指令 netstat -ano | findstr"61616" 
關閉進程的指令:taskkill /PID  6400,PID後面跟着的就是你要關閉的進程PID。
安裝成功後到任務管理器看進程是否存在並開啓進程
開啓服務成功後訪問:http://localhost:8161/admin ,不手動進行配置的話默認賬號跟密碼都是admin
2. netTOActiveMQ的簡單使用
①消息隊列的簡單示例
使用NuGet引入ActiveMQ的類庫Apache.NMS.ActiveMQ,然後就可以直接寫測試代碼了。如下所示:

using Apache.NMS;
using Apache.NMS.ActiveMQ;
using Apache.NMS.Util;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading;
using System.Threading.Tasks;

namespace ActiveMQ
{
    class CombineTest
   {
        static void Main(string[] args)
       {
           //
           Task.Run(() =>
           {
               string queuesName = "myQueue2";
               Uri _uri = new Uri(String.Concat("activemq:failover:(tcp://localhost:61616)"));
               IConnectionFactory factory = new ConnectionFactory(_uri);
               using (IConnection conn = factory.CreateConnection())
               {
                   using (ISession session = conn.CreateSession())
                   {
                       conn.Start();
                       IDestination destination = SessionUtil.GetDestination(session, queuesName);
                       using (IMessageConsumer consumer = session.CreateConsumer(destination))
                       {
                           consumer.Listener += (IMessage message) =>
                           {
                               ITextMessage msg = (ITextMessage)message;
                               Console.WriteLine(" + msg.Text);
                           };
                           Console.ReadLine();
                       }
                   }
               }
           });
           //
           Task.Run(() =>
           {
               string _queuesName = "myQueue2";
               var __uri = new Uri(string.Concat("activemq:failover:(tcp://localhost:61616)"));
               IConnectionFactory _factory = new ConnectionFactory(__uri);
               using (IConnection _conn = _factory.CreateConnection())
               {
                   using (ISession _session = _conn.CreateSession())
                   {
                       IDestination _destination = SessionUtil.GetDestination(_session, _queuesName);
                       using (IMessageProducer producer = _session.CreateProducer(_destination))
                       {
                           //
                           for (int i = 0; i < 10; i++)
                           {
                               ITextMessage request = _session.CreateTextMessage(" + i);
                               producer.Send(request);
                               Console.WriteLine(" + i);
                               Thread.Sleep(200);

                           }

                       }
                   }
               }

           });

           Console.ReadLine();
       }
   }
}


如我們代碼所示,採用兩個進程,一個作爲消息生產者發送消息一個作爲消息消費者接收消息。我們先不急着解析代碼,執行一下代碼看看效果。
但是在我們項目中編譯後的文件是一個DLL類庫文件不是可執行的文件,處理很簡單在這個測試項目右鍵-》屬性-》改爲應用程序-》啓動對象改爲這個測試類。在項目代碼路徑下找到這個項目的BIN\DEDUG文件夾就能找到對應的可執行文件xxx.exe。雙擊這個文件就能看到結果了(如果沒有反應,則查看一下你的啓動對象是否有設置對),執行結果:

當然我們也可以把這些生成的消息都寫到日誌文件裏。
接下來我們就一起來分析一下代碼:
首先Task.Run(() =>{yourcode})這是一個用lambda表達式實現的一個委託,沒什麼好講的啦,都是基礎,不清楚的可以再複習一下委託和lambda。
主要是對ActiveMQ的一些操作代碼進行分析和擴展。

如圖先定義服務器的地址,端口默認61616,failover是失效轉移協議,這裏涉及到集羣的概念。
集羣包括consumer集羣(消息消費者集羣)和broker集羣(消費服務器集羣)
關於消費者集羣
對於消費者集羣,對於隊列消費者,主要是:1.保證如果某一個消費者死亡了,任何它沒有確認完的消息會被重傳別的正常的消費者來消費;2.如果一個消費者消費消息過快,就可以比別的消費者得到更多的消息;3.如果一個消費者消費消息過慢,它就會被少得到消息。第1點幾乎是所有JMS提供者都有的功能——消息重傳機制(可以參考我的其他ActiveMQ博文)。第2點和第3點也是很正常的,因爲大多消費者和線程是一一對應的關係(獨立線程),你消費速率快,當然可以自己去服務器拉取更多的消息。當然ActiveMQ在隊列上給消費者提供了高性能的負載均衡策略。對於主題訂閱者,由於每個訂閱者接受到被推送的消息都和其他訂閱者無關
關於服務器集羣
 對於消息服務器集羣,主要是指:1.如果集羣中的某一臺消息服務器宕機,與該臺消息服務器相連接的生產者和消費者能否自動連接到其他正常工作的消息服務器(主從複製)。2.如果集羣中的某一臺消息服務器宕機,該臺服務器上未消費的消息能否在該臺服務器恢復正常之前由其他服務器轉發。3.集羣環境中會不會導致某臺消息服務器上只有消費者或者某臺消息服務器上只有生產者。對於1,ActiveMQ提供了一種叫做失效轉移(也叫故障轉移,FailOver)的策略。失效轉移提供了在傳輸層上重新連接到其他任何傳輸器的功能。使用它很簡單,只需要在uri中配置就行了,語法如下:

failover:(uri1,...,uriN)?transportOptions 或者 failover:uri1,...,uriN
例子:

failover:(tcp://primary:61616,tcp://secondary:61616)?randomize=false

failover:(tcp://localhost:61616,tcp://remotehost:61616)?initialReconnectDelay=100 (

如果這樣使用報錯你可以試試這個:failover://(tcp://localhost:61616,tcp://remotehost:61616)?initialReconnectDelay=100  (this way works in ActiveMQ 4.1.1 the one above does not))
如果某個ActiveMQ客戶端發現uri1地址失效了,它會立即轉向uri地址列表中其他可以連接的消息服務器進行重連,以保證繼續正常工作,請注意,並不是uri1失效了就會選則uri2重連,這種選擇其他地址的方式默認是隨機的,以保證負載均衡,如果你想關閉隨機,可以transportOptions中加入randomize=false。


3. transportOptions參數分析
transportOptions有多種參數可以選擇,如下(參考大神的分析:https://blog.csdn.net/u014431479/article/details/84626916):

initialReconnectDelay:默認爲10,單位毫秒,表示第一次嘗試重連之前等待的時間。

maxReconnectDelay:默認30000,單位毫秒,表示兩次重連之間的最大時間間隔。

useExponentialBackOff:默認爲true,表示重連時是否加入避讓指數來避免高併發。

reconnectDelayExponent:默認爲2.0,重連時使用的避讓指數。

maxReconnectAttempts:5.6版本之前默認爲-1,5.6版本及其以後,默認爲0,0表示重連的次數無限,配置大於0可以指定最大重連次數。

startupMaxReconnectAttempts:默認爲0,如果該值不爲0,表示客戶端接收到消息服務器發送來的錯誤消息之前嘗試連接服務器的最大次數,一旦成功連接後,maxReconnectAttempts值開始生效,如果該值爲0,則默認採用maxReconnectAttempts。

randomize:默認爲true,表示在URI列表中選擇URI連接時是否採用隨機策略,記住,這種隨機策略在第一次選擇URI列表中的地址時就開始生效,所以,如果爲true的話,一個生產者和一個消費者的Failover連接地址都是兩個URI的話,有可能生產者連接的是第一個,而消費者連接的是第二個,造成一個服務器上只有生產者,一個服務器上只有消費者的尷尬境地。

backup:默認爲false,表示是否在連接初始化時將URI列表中的所有地址都初始化連接,以便快速的失效轉移,默認是不開啓。

timeout:默認爲-1,單位毫秒,是否允許在重連過程中設置超時時間來中斷的正在阻塞的發送操作。-1表示不允許,其他表示超時時間。

nested.*:默認爲null,5.9及其以後版本可用,表示給嵌套的URL添加額外的選項。 以前,如果你想檢測讓死連接速度更快,你必須在wireFormat.maxInactivityDuration= 1000選項添加到失效轉移列表中的所有嵌套的URL。例如:

failover:(tcp://host01:61616?wireFormat.maxInactivityDuration=1000,tcp://host02:61616?wireFormat.maxInactivityDuration=1000,tcp://host03:61616?wireFormat.maxInactivityDuration=1000)
而現在,你只需要這樣:

failover:(tcp://host01:61616,tcp://host02:61616,tcp://host03:61616)?nested.wireFormat.maxInactivityDuration=1000

warnAfterReconnectAttempts.*:默認爲10,5.10及其以後的版本可用,表示每次重連該次數後會打印日誌告警,設置<=0的值表示禁用

econnectSupported:默認爲true,表示客戶端是否應響應經紀人 ConnectionControl事件與重新連接(參見:rebalanceClusterClients)updateClusterClients:默認爲false,如果爲true,則會將broker集羣的拓撲結構的改變信息傳遞給連接的客戶端。

rebalanceClusterClients:默認爲false,如果爲true,則如果有新的消息服務器加入到消息服務器集羣中,則連接的客戶端將被要求重新平衡(asked to rebalance)。注意,  priorityBackup=true能覆蓋。

updateClusterClientsOnRemove:默認爲false,如果爲true,則當一個集羣從網絡中移除的時候將更新客戶端。有了這個選項,可以在消息服務器移除時更新客戶端,而不是僅僅只是新增消息服務器時更新。(難道官方文檔有問題:if true, will update clients when a cluster is removed from the network. Having this as separate option enables clients to be updated when new brokers join, but not when brokers leave.)

updateClusterFilter:默認爲null,如果有值,將會是逗號分隔的正則表達式列表,用來過濾掉失效轉移時的消息服務器集羣中的服務器名稱。

ActiveMQ提供了優先級備份(priority backup )的特性,所以你可以讓客戶端自動重連到所謂的“優先級”URI,你可以在客戶端如下配置URI地址:
failover:(tcp://local:61616,tcp://remote:61616)?randomize=false&priorityBackup=true
在某些情況下,你希望不止一個URI地址優先,則你可以使用priorityURIs參數:
failover:(tcp://local1:61616,tcp://local2:61616,tcp://remote:61616)?randomize=false&priorityBackup=true&priorityURIs=tcp://local1:61616,tcp://local2:61616

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章