記c# rabbitmq的使用


  本來項目中使用的是msmq,后來看到一篇文章,有人比較了一下幾種消息隊列的性能,rabbitmq的性能要高於msmq,並且相對成熟。於是准備把項目中的消息隊列換一下。這里寫篇文章只為記錄rabbitmq的安裝、配置以及使用。方便以后自己查看,也算是留個記錄。

  安裝

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

  配置

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

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

]}
].

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

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

設置完后,別忘記了以下操作,否則配置不起作用。

  • 停止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服務;

  查看消息隊列

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

       2、安裝了Rabbitmq后,默認也安裝了該管理工具,執行命令即可啟動
            rabbitmq-plugins enable rabbitmq_management(先定位到rabbitmq安裝目錄)  
            
        3、啟動后,直接在瀏覽器地址輸入: 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());

                    }
                }
            }

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM