記c# rabbitmq的使用

  原本項目中使用的是msmq,後來看到一篇文章,有人比較了一下幾種消息隊列的性能,rabbitmq的性能要高於msmq,而且相對成熟。因而準備把項目中的消息隊列換一下。這裏寫篇文章只爲記錄rabbitmq的安裝、配置以及使用。方便之後本身查看,也算是留個記錄。html

  安裝web

  在windows下面安裝rabbitmq很簡單,先到rabbitmq的官方網站http://www.rabbitmq.com/去下載最新版便可。安裝過程當中可能會提醒你安裝Erlang,按照提示會跳轉到對應的下載頁面,下載進行安裝就好了。這裏基本上就是一路next就能夠的,不過須要注意的是,在安裝的時候須要使用管理員身份進行安裝,不然rabbitmq的在線管理工具是沒法啓用的。json

  配置windows

  裝好以後仍是有一個配置文件須要設置一下的,位置是在%HOMEPATH%\AppData\Roaming\RabbitMQ,你會看到下面已經有一個rabbitmq.config.example文件,不過還須要新建一個rabbitmq.config文件。配置內容可參考瀏覽器

[
{rabbit,
[
{loopback_users, [<<"guest">>]},
{tcp_listeners, [{"127.0.0.1", 5672}]}bash

]}
].tcp

loopback_users:設置只能在與RabbitMq服務同一臺機器上訪問服務的用戶。函數

tcp_listeners:設置RabbitMQ監聽的IP地址與端口。只監聽局域網內網iP、修改默認端口,防止被入侵攻擊。工具

設置完後,別忘記了如下操做,不然配置不起做用。oop

  • 中止RabbitMQ服務;
  • 從新安裝服務使配置生效:rabbitmq-service.bat install
  • 不過這樣設置以後只能在本地訪問消息隊列,要想能夠遠程訪問,還須要設置一下。設置方法爲,

    新創建了一個系統用戶rabbit(名稱本身取),而後授予全部權限,使用下面的命令:

    rabbitmqctl add_user rabbit 123456
    rabbitmqctl set_user_tags rabbitadministrator rabbitmqctl set_permissions -p / rabbit ".*" ".*" ".*"

  以上命令要切換到rabbitmq的安裝目錄下的sbin路徑,例如D:\Program Files\RabbitMQ Server\rabbitmq_server-3.4.0\sbin

  • 啓動RabbitMQ服務;

  查看消息隊列

  一、官方提供的一個web管理工具(rabbitmq_management)

       二、安裝了Rabbitmq後,默認也安裝了該管理工具,執行命令便可啓動
            rabbitmq-plugins enable rabbitmq_management(先定位到rabbitmq安裝目錄)  
            
        三、啓動後,直接在瀏覽器地址輸入: http://localhost:15672/   帳號密碼都是:guest  
 
   代碼示例
    
var factory = new ConnectionFactory() { HostName = "192.168.5.199", UserName = "rabbit", Password = "123456" };
            using (var connection = factory.CreateConnection())
            {
                //rabbitmq服務端
                using (IModel channel = connection.CreateModel())
                {
                    //在MQ上定義一個持久化隊列,若是名稱相同不會重複建立
                    channel.QueueDeclare("TestQueue", true, false, false, null);

                    //輸入1,那若是接收一個消息,可是沒有應答,則客戶端不會收到下一個消息
                    channel.BasicQos(0, 1, false);

                    //在隊列上定義一個消費者
                    var consumer = new QueueingBasicConsumer(channel);
                    //消費隊列,並設置應答模式爲程序主動應答
                    channel.BasicConsume("TestQueue", false, consumer);

                    while (true)
                    {
                        //阻塞函數,獲取隊列中的消息
                        var ea = (BasicDeliverEventArgs)consumer.Queue.Dequeue();
                        byte[] bytes = ea.Body;
                        string str = Encoding.UTF8.GetString(bytes);
                        var msg = JsonConvert.DeserializeObject<RequestMsg>(str);
                        Console.WriteLine("HandleMsg:" + msg.Name.ToString());
                        //回覆確認
                        channel.BasicAck(ea.DeliveryTag, false);
                    }
                }
}
var factory = new ConnectionFactory() { HostName = "192.168.5.199", UserName = "rabbit", Password = "123456" };
                //rabbitmq客戶端
                using (var channel = connection.CreateModel())
                {
                    channel.QueueDeclare("PosQueue", true, false, false, null);
                    while (true)
                    {
                        var requestMsg = new RequestMsg();
                        requestMsg.Name = string.Format("Name_{0}", "ccc");
                        requestMsg.Code = string.Format("Code_{0}", "eee");
                        string jsonStr = JsonConvert.SerializeObject(requestMsg);
                        byte[] bytes = Encoding.UTF8.GetBytes(jsonStr);

                        //設置消息持久化
                        IBasicProperties properties = channel.CreateBasicProperties();
                        properties.DeliveryMode = 2;
                        channel.BasicPublish("", "PosQueue", properties, bytes);

                        Console.WriteLine("消息已發送:" + requestMsg.ToString());

                    }
                }
            }
相關文章
相關標籤/搜索