1. 程式人生 > >RabbitMQ 在 C# 中簡單應用

RabbitMQ 在 C# 中簡單應用

情況 get ESS 按順序 一次 需要 word message serve

原文: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在申報隊列時,如果不指定名稱會自動生成一個,這還是不錯的。

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

技術分享圖片

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

RabbitMQ 在 C# 中簡單應用