C#中關於RabbitMQ應用的圖文代碼詳解

來源:互聯網
上載者:User
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在申報隊列時,如果不指定名稱會自動產生一個,這還是不錯的。

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

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

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.