RabbitMQ 在 C# 中簡單應用


RabbitMQ是什么及如何安裝就不再贅述,百度一下就知道了,只是在配置方面要多加注意。

話不多說,先直接上一個簡示例代碼

發送端:

            ConnectionFactory factory = new ConnectionFactory { HostName = "hostname", UserName = "root", Password = "root001", VirtualHost = "hostserver" };
            using (IConnection conn = factory.CreateConnection())
            {
                using (IModel im = conn.CreateModel())
                {
                    im.ExchangeDeclare("rabbitmq_route", ExchangeType.Direct);
                    im.QueueDeclare("rabbitmq_query", false, false, false, null);
                    im.QueueBind("rabbitmq_query", "rabbitmq_route", ExchangeType.Direct, null);
                    for (int i = 0; i < 1000; i++)
                    {
                        byte[] message = Encoding.UTF8.GetBytes("Hello Lv");
                        im.BasicPublish("rabbitmq_route", ExchangeType.Direct, null, message);
                        Console.WriteLine("send:" + i);
                    }
                }
            }

 

接收端:

            ConnectionFactory factory = new ConnectionFactory { HostName = "hostname", UserName = "root", Password = "root001", VirtualHost = "hostserver" };
            using (IConnection conn = factory.CreateConnection())
            {
                using (IModel im = conn.CreateModel())
                {
                    while (true)
                    {
                        BasicGetResult res = im.BasicGet("rabbitmq_query", true);
                        if (res != null)
                        {
                            Console.WriteLine("receiver:"+UTF8Encoding.UTF8.GetString(res.Body));
                        }
                    }
                }
            }

 

 發送端一次性發送一千條,發送過程很快,接收時相對要慢一些。

 

                            

                          上述DEMO只限一個接收着,那相同的發送量,多個接收者會出現什么情況,添加一個新的接收端,直接復制DEMO中接收端即可。

                         

 

附上運行結果:

 

                        

 

可以看到,在兩個接收端同時運行時,RabbitMQ 會按順序的分發每個消息。當每個收到確認后,會將該消息刪除,然后將下一個分發到下一個接收者,主要是因為RabbitMQ的循環分發機制。

上面簡單說了一下,在多個接收者時,因為循環分發的原因,消息幾乎是兩個接收端對分的。

那么如何將相同的消息分發到多個接收端。

 對發送端代碼進行修改:

 

            ConnectionFactory factory = new ConnectionFactory { HostName = "hostname", UserName = "root", Password = "root001", VirtualHost = "host" }; using (IConnection conn = factory.CreateConnection()) { using (IModel im = conn.CreateModel()) { im.ExchangeDeclare("rabbitmq_route_Fanout", ExchangeType.Fanout);// 路由 int i = 0; while (true) { Thread.Sleep(1000); ++i; byte[] message = Encoding.UTF8.GetBytes(i.ToString()); im.BasicPublish("rabbitmq_route_Fanout", "", null, message); Console.WriteLine("send:" + i.ToString()); } } }

                         

與上種方式比較,會發現在代碼注釋后面少兩段代碼,在設置了Fanout方式后,不需要再指定隊列名稱。停一秒是為了方便看結果,以免刷新太快。

 再來看看接收端代碼:

 

            ConnectionFactory factory = new ConnectionFactory { HostName = "hostname", UserName = "root", Password = "root001", VirtualHost = "host" }; using (IConnection conn = factory.CreateConnection()) { using (IModel im = conn.CreateModel()) { im.ExchangeDeclare("rabbitmq_route_Fanout", ExchangeType.Fanout); var queueOk = im.QueueDeclare();//1 im.QueueBind(queueOk.QueueName, "rabbitmq_route_Fanout", "");//2 var consumer = new QueueingBasicConsumer(im);//3 im.BasicConsume(queueOk.QueueName, true, consumer);//4 while (true) {var _result = (BasicDeliverEventArgs)consumer.Queue.Dequeue();//5 var body = _result.Body; var message = Encoding.UTF8.GetString(body); Console.WriteLine("received:{0}", message); } } 

 

當一個新的接收端連接時(消費者),需要一個申報一個新的隊列,注釋1處代碼,RabbitMQ在申報隊列時,如果不指定名稱會自動生成一個,這還是不錯的。

 兩個接收端時運行結果,符合預期。

 

                                                                

                                        

  至於廣播方式有什么不好之處,親自運行下就知道了.

                       


免責聲明!

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



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