绍兴人 發表於 2020-1-2 15:26:00

C# .net 环境下使用rabbitmq消息队列

<p>  消息队列的地位越来越重要,几乎是面试的必问问题了,不会使用几种消息队列都显得尴尬,正好本文使用C#来带你认识rabbitmq消息队列</p>
<p>  首先,我们要安装rabbitmq,当然,如果有现成的,也可以使用,不知道曾几何时,我喜欢将数据库等等软件安装在linux虚拟机,如果没现成的rabbitmq,按照下面的来吧,嘿嘿</p>
<p>  rabbitmq安装:https://www.cnblogs.com/shanfeng1000/p/11951703.html</p>
<p>  如果要实现rabbitmq集群,参考:https://www.cnblogs.com/shanfeng1000/p/12097054.html</p>
<p>  我这里使用的是rabbitmq集群,但是没有比较,只是已经安装好了,就直接使用算了</p>
<p>  虚拟机集群地址:192.168.209.133,192.168.209.134,192.168.209.135</p>
<p>  端口使用的默认端口,都是5672,<span style="color: rgba(0, 0, 0, 1)">也就是AMQP协议端口</span></p>
<p>  <strong><span style="font-size: 14pt">Rabbitmq的工作模式</span></strong></p>
<p>  先说说几个概念</p>
<p>  生产者(producer):负责生产消息,可以有多个生产者,可以理解为生成消息的那部分逻辑</p>
<p>  消费者(consumer):从队列中获取消息,对消息处理的那部分逻辑</p>
<p>  队列(queue):用于存放消息,可以理解为先进先出的一个对象</p>
<p>  交换机(exchange):顾名思义,就是个中介的角色,将接收到的消息按不同的规则转发到其他交换机或者队列中</p>
<p>  路由(route):就是交换机分发消息的规则,交换机可以指定路由规则,生产者在发布消息时也可以指定消息路由,比如交换机中设置A路由表示将消息转发到队列1,B路由表示将消息转发到队列2,那么当交换机接收到消息时,如果消息的路由满足A路由,则将消息转发到队列1,如果满足B路由则将消息转发到队列2</p>
<p>  虚拟主机(virtual host):虚拟地址,用于进行逻辑隔离,一个虚拟主机里面可以有若干个 exchange 和 queue,但是里面不能有相同名称的 exchange 或 queue</p>
<p>  再看看rabbitmq的几种工作模式,具体可参考rabbitmq官网给出的Demo:https://www.rabbitmq.com/getstarted.html</p>
<p>    <img src="data:image/png;base64,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9erVLFq0iGg0Sm9vL52dnbz22mu0trbiui7hcBjXdRERRISTua6L4zg4joPruriui+u6uK6L67q4rovruriui+u6uK6L67q4rovruriui+u6uK6L67q4rovruriui+u6uK6L67q4rovruriui+u6uK6L67q4rovruriui+u6eJ6HiCAivFtKKUQEEcEwDAzDoLy8nLy8PAzDwPM8ysrKyMvL48CBAxw/fhzLsohEIiilMAwDwzBQSqGUQkRQSmGaJqZpopRCKYWIoJTCNE0Mw6C8vJxgMIjWmuHhYerq6rBtG8MwUEohIiilUEphGAZKKQzDQCmFYRgYhoFpmhiGgYggIiilEBFEhLdiGgYXT53K/mefpa2gAB0IgAiIMCatUek0xVu38n85Dlc0N2MaBmcTkxzOlIiQlclkePzxx5k3bx7r169nzpw5vPzyyxQWFhKJRBgeHiYajXL11Vdz8OBBkskkWmtmzZrF2rVraWxsZOfOnfT29nLllVfyi1/8gltvvZUf//jHVFdXc/ToURzHYdGiRcTjcUpKShARsrTWpFIpDh06xIsvvkhzczN33HEHtm1zJrTWuK6LaZq8G7t372Z0dJStW7cSDAYJBAK8+uqrzJ07l4aGBp555hnOOeccfv7zn2NZFldddRXr16/nzjvvJJ1O8+tf/5qysjLWrl1LXV0d06ZNY9u2bfT19XHJJZdw77338vd///c4jkMymaS3txetNcPDw/zsZz9j1qxZPPzww3z5y1+muLgYESGHHN4/juPw8Esv4Xzuc7ypVAqGhyE/nzejQyFeymQ4fPgwb1dHRwd33XUXfX19LF68mEsuuZSRkTz8fmEsSvkJh+fR3f1DJk78B96c0N8fJJn0eDtCoRC33347c+fOxXEcsubNm8cdd9xBIBAglUpRXFzMzJkz8fv9DA0NsX79etrb27nppptYsmQJP/jBD1i6dCnTp09n8+bNaK2pqKhgxowZvN96enqYMWMGixYtoqWlBcuyuOaaa+ju7mZwcBARIYccPrgs02TVjBk0jR/P//Hww2yZO5fecBgnHMazbf6b1qhUCn8sRnl/P1fs3s3fX3IJkVAIQylsy+Lqq69Ga42IMHXqVLI8z8NxHLTW7Nu3j3Xr1uHz+airq6OoqAjLsohEIiil2LNnD1u3bkUphdYaESFLa42IoLVGRMjSWiMi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" alt="" width="750"></p>
<p>  其中,第6中类似我们常用的请求-响应模式,但是使用的RPC请求响应,用的比较少,这里就不过多解释,感兴趣的可以参考官网文档:https://www.rabbitmq.com/tutorials/tutorial-six-dotnet.html。</p>
<p>  总的来说,就是生产者将消息发布到rabbitmq上,然后消费者连接rabbitmq,获取到消息就消费,但是有几点说明一下</p>
<p><span style="color: rgba(0, 0, 255, 1)">  1、rabbitmq中的消息是可被多次消费的,因为rabbitmq提供了ack机制,当消费者在消费消息时,如果将自动ack设置成false,那么需要手动提交ack才能告诉rabbitmq消息已被使用,否则当通道关闭时,消息会继续呆在队列中等待消费</span></p>
<p><span style="color: rgba(0, 0, 255, 1)">  2、当存在多个消费者时,默认情况下,一个消费者获取一个消息,处理完成后再获取下一个,但是rabbitmq消费一次性获取多个,当然后当这些消息消费完成后,再获取下一批,这也就是rabbitmq的Qos机制</span></p>
<p><span style="color: rgba(0, 0, 255, 1)">  </span></p>
<p>  <strong><span style="font-size: 14pt">C#使用rabbitmq</span></strong></p>
<p>  如果感兴趣的人多,到时候再单独开一篇博文,现在就介绍其中的1-5种,也可以分类成两种:不使用交换机和使用交换机,所以下面就分这两种来说明</p>
<p>  首先,我们创建了两个Demo项目:RabbitMQ.PublishConsole和RabbitMQ.ConsumeConsole,分别使用使用nuget安装RabbitMQ.Client:</p>
<p>  <img src="https://img2018.cnblogs.com/blog/1033563/202001/1033563-20200102093342764-629995980.png" alt="" width="750"></p>
<p>  其中RabbitMQ.PublishConsole是用来生产消息,RabbitMQ.ConsumeConsole用来消费消息  </p>
<p>  这里我们安装的是最新版本,旧版本和新版本在使用上可能会有一些区别</p>
<hr>
<p>&nbsp;</p>
<p><strong><span style="font-size: 14pt">  <span style="font-size: 18px">不使用交换机情形</span></span></strong></p>
<p>  不使用交换机有两种模式:简单模式和工作模式</p>
<p>  这里先贴上生产者生成消息的代码,简单模式和工作模式这部分测试代码是一样的:  </p>
<div class="cnblogs_code">  <img src="https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif" alt="" id="code_img_closed_172ace10-1e8f-4fd9-ae51-c16b0578c8f4" class="code_img_closed"><img src="https://images.cnblogs.com/OutliningIndicators/ExpandedBlockStart.gif" alt="" id="code_img_opened_172ace10-1e8f-4fd9-ae51-c16b0578c8f4" class="code_img_opened" style="display: none">
<div id="cnblogs_code_open_172ace10-1e8f-4fd9-ae51-c16b0578c8f4" class="cnblogs_code_hide">
<pre><span style="color: rgba(0, 0, 255, 1)">using</span><span style="color: rgba(0, 0, 0, 1)"> RabbitMQ.Client;
</span><span style="color: rgba(0, 0, 255, 1)">using</span><span style="color: rgba(0, 0, 0, 1)"> System;
</span><span style="color: rgba(0, 0, 255, 1)">using</span><span style="color: rgba(0, 0, 0, 1)"> System.Collections.Generic;
</span><span style="color: rgba(0, 0, 255, 1)">using</span><span style="color: rgba(0, 0, 0, 1)"> System.Text;

</span><span style="color: rgba(0, 0, 255, 1)">namespace</span><span style="color: rgba(0, 0, 0, 1)"> RabbitMQ.PublishConsole
{
    </span><span style="color: rgba(0, 0, 255, 1)">class</span><span style="color: rgba(0, 0, 0, 1)"> Program
    {
      </span><span style="color: rgba(0, 0, 255, 1)">static</span> <span style="color: rgba(0, 0, 255, 1)">void</span> Main(<span style="color: rgba(0, 0, 255, 1)">string</span><span style="color: rgba(0, 0, 0, 1)">[] args)
      {
            </span><span style="color: rgba(0, 0, 255, 1)">string</span>[] hosts = <span style="color: rgba(0, 0, 255, 1)">new</span> <span style="color: rgba(0, 0, 255, 1)">string</span>[] { <span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">192.168.209.133</span><span style="color: rgba(128, 0, 0, 1)">"</span>, <span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">192.168.209.134</span><span style="color: rgba(128, 0, 0, 1)">"</span>, <span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">192.168.209.135</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)"> };
            </span><span style="color: rgba(0, 0, 255, 1)">int</span> port = <span style="color: rgba(128, 0, 128, 1)">5672</span><span style="color: rgba(0, 0, 0, 1)">;
            </span><span style="color: rgba(0, 0, 255, 1)">string</span> userName = <span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">admin</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">;
            </span><span style="color: rgba(0, 0, 255, 1)">string</span> password = <span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">123456</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">;
            </span><span style="color: rgba(0, 0, 255, 1)">string</span> virtualHost = <span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">/</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">;

            </span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">创建一个连接工厂</span>
            <span style="color: rgba(0, 0, 255, 1)">var</span> factory = <span style="color: rgba(0, 0, 255, 1)">new</span><span style="color: rgba(0, 0, 0, 1)"> ConnectionFactory();
            factory.UserName </span>=<span style="color: rgba(0, 0, 0, 1)"> userName;
            factory.Password </span>=<span style="color: rgba(0, 0, 0, 1)"> password;
            factory.Port </span>=<span style="color: rgba(0, 0, 0, 1)"> port;
            factory.VirtualHost </span>=<span style="color: rgba(0, 0, 0, 1)"> virtualHost;
            </span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">创建一个连接,此时可以在rabbitmq后台Web管理页面中的Connections中看到一个连接生成
            </span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">一个连接可以创建多个通道</span>
            <span style="color: rgba(0, 0, 255, 1)">var</span> connection =<span style="color: rgba(0, 0, 0, 1)"> factory.CreateConnection(hosts);

            </span><span style="color: rgba(0, 0, 255, 1)">string</span> queue = <span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">queue1</span><span style="color: rgba(128, 0, 0, 1)">"</span>;<span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">队列名称

            </span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">创建一个通道
            </span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">此时可以在rabbitmq后台Web管理页面中的Channels中看到一个新通道生成</span>
            <span style="color: rgba(0, 0, 255, 1)">var</span> channel =<span style="color: rgba(0, 0, 0, 1)"> connection.CreateModel();
            </span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">给通道绑定一个队列,队列如果不存在,则会创建新队列,如果队列已存在,那么参数一定要正确,特别是arguments参数,否则会报错</span>
            <span style="color: rgba(0, 0, 255, 1)">var</span> arguments = <span style="color: rgba(0, 0, 255, 1)">new</span> Dictionary&lt;<span style="color: rgba(0, 0, 255, 1)">string</span>, <span style="color: rgba(0, 0, 255, 1)">object</span>&gt;() { { <span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">x-queue-type</span><span style="color: rgba(128, 0, 0, 1)">"</span>, <span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">classic</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)"> } };
            channel.QueueDeclare(queue: queue, durable: </span><span style="color: rgba(0, 0, 255, 1)">true</span>, exclusive: <span style="color: rgba(0, 0, 255, 1)">false</span>, autoDelete: <span style="color: rgba(0, 0, 255, 1)">false</span><span style="color: rgba(0, 0, 0, 1)">, arguments: arguments);

            </span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">发布10条消息</span>
            <span style="color: rgba(0, 0, 255, 1)">for</span> (<span style="color: rgba(0, 0, 255, 1)">var</span> i = <span style="color: rgba(128, 0, 128, 1)">0</span>; i &lt; <span style="color: rgba(128, 0, 128, 1)">10</span>; i++<span style="color: rgba(0, 0, 0, 1)">)
            {
                </span><span style="color: rgba(0, 0, 255, 1)">var</span> buffer =<span style="color: rgba(0, 0, 0, 1)"> Encoding.UTF8.GetBytes(i.ToString());
                channel.BasicPublish(</span><span style="color: rgba(128, 0, 0, 1)">""</span>, queue, <span style="color: rgba(0, 0, 255, 1)">null</span><span style="color: rgba(0, 0, 0, 1)">, buffer);
            }
            channel.Close();

            Console.ReadKey();
      }
    }
}</span></pre>
</div>
<span class="cnblogs_code_collapse">RabbitMQ.PublishConsole</span></div>
<p>  上述代码执行完成后,队列queue1中就有了10条消息,可以在rabbitmq的后台管理中看到:  </p>
<p>  <img src="https://img2018.cnblogs.com/blog/1033563/202001/1033563-20200102094226965-1395253677.png" alt="" width="750"></p>
<p>  代码中提到,通道在申明队列时,如果队列已经存在,则申明的参数一定要对上,否则会抛出异常:<span style="color: rgba(255, 0, 0, 1)"><span style="color: rgba(255, 0, 0, 1)">The AMQP operation was interrupted: AMQP close-reason, initiated by Peer, code=406, text='PRECONDITION_FAILED - inequivalent arg 'x-queue-type' for queue 'queue1' in vhost '/': received none but current is the value 'classic' of type 'longstr'', classId=50, methodId=10</span></span></p>
<p>  比如这里,我实现在rabbitmq后台创建了队列,那么他们的对应关系如下图: </p>
<p>   <img src="https://img2018.cnblogs.com/blog/1033563/201912/1033563-20191231193038446-1032871323.png" alt="" width="750"></p>
<p>  <img src="https://img2018.cnblogs.com/blog/1033563/201912/1033563-20191231193144336-1305336717.png" alt="" width="750"></p>
<p>&nbsp;  <span style="font-size: 16px"><strong>简单模式</strong></span></p>
<p>  这个模式很简单,其实就是只有一个消费者,简单的保证操作的顺序性</p>
<p>  <img src="https://img2018.cnblogs.com/blog/1033563/201912/1033563-20191231175821997-1216066387.png" alt="" width="300"></p>
<p>&nbsp;  接着贴上消费者代码:</p>
<div class="cnblogs_code">  <img src="https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif" alt="" id="code_img_closed_8691fdf8-6ce9-4207-bcd5-5adc67c319e5" class="code_img_closed"><img src="https://images.cnblogs.com/OutliningIndicators/ExpandedBlockStart.gif" alt="" id="code_img_opened_8691fdf8-6ce9-4207-bcd5-5adc67c319e5" class="code_img_opened" style="display: none">
<div id="cnblogs_code_open_8691fdf8-6ce9-4207-bcd5-5adc67c319e5" class="cnblogs_code_hide">
<pre><span style="color: rgba(0, 0, 255, 1)">using</span><span style="color: rgba(0, 0, 0, 1)"> RabbitMQ.Client;
</span><span style="color: rgba(0, 0, 255, 1)">using</span><span style="color: rgba(0, 0, 0, 1)"> RabbitMQ.Client.Events;
</span><span style="color: rgba(0, 0, 255, 1)">using</span><span style="color: rgba(0, 0, 0, 1)"> System;
</span><span style="color: rgba(0, 0, 255, 1)">using</span><span style="color: rgba(0, 0, 0, 1)"> System.Collections.Generic;
</span><span style="color: rgba(0, 0, 255, 1)">using</span><span style="color: rgba(0, 0, 0, 1)"> System.Text;
</span><span style="color: rgba(0, 0, 255, 1)">using</span><span style="color: rgba(0, 0, 0, 1)"> System.Threading;

</span><span style="color: rgba(0, 0, 255, 1)">namespace</span><span style="color: rgba(0, 0, 0, 1)"> RabbitMQ.ConsumeConsole
{
    </span><span style="color: rgba(0, 0, 255, 1)">class</span><span style="color: rgba(0, 0, 0, 1)"> Program
    {
      </span><span style="color: rgba(0, 0, 255, 1)">static</span> <span style="color: rgba(0, 0, 255, 1)">void</span> Main(<span style="color: rgba(0, 0, 255, 1)">string</span><span style="color: rgba(0, 0, 0, 1)">[] args)
      {
            </span><span style="color: rgba(0, 0, 255, 1)">string</span>[] hosts = <span style="color: rgba(0, 0, 255, 1)">new</span> <span style="color: rgba(0, 0, 255, 1)">string</span>[] { <span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">192.168.209.133</span><span style="color: rgba(128, 0, 0, 1)">"</span>, <span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">192.168.209.134</span><span style="color: rgba(128, 0, 0, 1)">"</span>, <span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">192.168.209.135</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)"> };
            </span><span style="color: rgba(0, 0, 255, 1)">int</span> port = <span style="color: rgba(128, 0, 128, 1)">5672</span><span style="color: rgba(0, 0, 0, 1)">;
            </span><span style="color: rgba(0, 0, 255, 1)">string</span> userName = <span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">admin</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">;
            </span><span style="color: rgba(0, 0, 255, 1)">string</span> password = <span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">123456</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">;
            </span><span style="color: rgba(0, 0, 255, 1)">string</span> virtualHost = <span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">/</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">;

            </span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">创建一个连接工厂</span>
            <span style="color: rgba(0, 0, 255, 1)">var</span> factory = <span style="color: rgba(0, 0, 255, 1)">new</span><span style="color: rgba(0, 0, 0, 1)"> ConnectionFactory();
            factory.UserName </span>=<span style="color: rgba(0, 0, 0, 1)"> userName;
            factory.Password </span>=<span style="color: rgba(0, 0, 0, 1)"> password;
            factory.Port </span>=<span style="color: rgba(0, 0, 0, 1)"> port;
            factory.VirtualHost </span>=<span style="color: rgba(0, 0, 0, 1)"> virtualHost;
            </span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">创建一个连接,此时可以在rabbitmq后台Web管理页面中的Connections中看到一个连接生成
            </span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">一个连接可以创建多个通道</span>
            <span style="color: rgba(0, 0, 255, 1)">var</span> connection =<span style="color: rgba(0, 0, 0, 1)"> factory.CreateConnection(hosts);

            </span><span style="color: rgba(0, 0, 255, 1)">string</span> queue = <span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">queue1</span><span style="color: rgba(128, 0, 0, 1)">"</span>;<span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">队列名称

            </span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">创建一个通道
            </span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">此时可以在rabbitmq后台Web管理页面中的Channels中看到一个新通道生成</span>
            <span style="color: rgba(0, 0, 255, 1)">var</span> channel =<span style="color: rgba(0, 0, 0, 1)"> connection.CreateModel();
            </span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">给通道绑定一个队列,队列如果不存在,则会创建新队列,如果队列已存在,那么参数一定要正确,特别是arguments参数,否则会报错</span>
            <span style="color: rgba(0, 0, 255, 1)">var</span> arguments = <span style="color: rgba(0, 0, 255, 1)">new</span> Dictionary&lt;<span style="color: rgba(0, 0, 255, 1)">string</span>, <span style="color: rgba(0, 0, 255, 1)">object</span>&gt;() { { <span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">x-queue-type</span><span style="color: rgba(128, 0, 0, 1)">"</span>, <span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">classic</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)"> } };
            channel.QueueDeclare(queue: queue, durable: </span><span style="color: rgba(0, 0, 255, 1)">true</span>, exclusive: <span style="color: rgba(0, 0, 255, 1)">false</span>, autoDelete: <span style="color: rgba(0, 0, 255, 1)">false</span><span style="color: rgba(0, 0, 0, 1)">, arguments: arguments);
            </span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">channel.BasicQos(2, 2, false);</span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">设置QOS

            </span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">在通道中定义一个事件消费者</span>
            EventingBasicConsumer consumer = <span style="color: rgba(0, 0, 255, 1)">new</span><span style="color: rgba(0, 0, 0, 1)"> EventingBasicConsumer(channel);
            consumer.Received </span>+= (sender, e) =&gt;<span style="color: rgba(0, 0, 0, 1)">
            {
                </span><span style="color: rgba(0, 0, 255, 1)">string</span> message =<span style="color: rgba(0, 0, 0, 1)"> Encoding.UTF8.GetString(e.Body);
                Console.WriteLine($</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">接收到消息:{message}</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">);

                Thread.Sleep(</span><span style="color: rgba(128, 0, 128, 1)">500</span>);<span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">暂停一下

                </span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">通知消息已被处理,如果没有,那么消息将会被重复消费</span>
                channel.BasicAck(e.DeliveryTag, <span style="color: rgba(0, 0, 255, 1)">false</span><span style="color: rgba(0, 0, 0, 1)">);
            };
            </span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">ack设置成false,表示不自动提交,那么就需要在消息被消费后,手动调用BasicAck去提交消息</span>
            channel.BasicConsume(queue, <span style="color: rgba(0, 0, 255, 1)">false</span><span style="color: rgba(0, 0, 0, 1)">, consumer);

            Console.ReadKey();
      }

      
    }
}</span></pre>
</div>
<span class="cnblogs_code_collapse">RabbitMQ.ConsumeConsole</span></div>
<p>  上述代码执行完成后,在后台管理中可以看到消息被消费掉了</p>
<p>  <img src="https://img2018.cnblogs.com/blog/1033563/202001/1033563-20200102100724566-1935346332.png" alt="" width="750"></p>
<p>&nbsp;</p>
<p>  <span style="font-size: 16px"><strong>工作模式</strong></span></p>
<p>&nbsp;  工作模式是简单模式的拓展,如果业务简单,对消息的消费是一个耗时的过程,这个模式是一个好的选择。</p>
<p>  <img src="https://img2018.cnblogs.com/blog/1033563/202001/1033563-20200102095219879-233008504.png" alt="" width="300">&nbsp;</p>
<p>&nbsp;  接着调用生产者代码生产10条消息,下面是消费者的测试代码  </p>
<div class="cnblogs_code">  <img src="https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif" alt="" id="code_img_closed_60f96f14-04c0-4fc9-85f6-683938b4f08e" class="code_img_closed"><img src="https://images.cnblogs.com/OutliningIndicators/ExpandedBlockStart.gif" alt="" id="code_img_opened_60f96f14-04c0-4fc9-85f6-683938b4f08e" class="code_img_opened" style="display: none">
<div id="cnblogs_code_open_60f96f14-04c0-4fc9-85f6-683938b4f08e" class="cnblogs_code_hide">
<pre><span style="color: rgba(0, 0, 255, 1)">using</span><span style="color: rgba(0, 0, 0, 1)"> RabbitMQ.Client;
</span><span style="color: rgba(0, 0, 255, 1)">using</span><span style="color: rgba(0, 0, 0, 1)"> RabbitMQ.Client.Events;
</span><span style="color: rgba(0, 0, 255, 1)">using</span><span style="color: rgba(0, 0, 0, 1)"> System;
</span><span style="color: rgba(0, 0, 255, 1)">using</span><span style="color: rgba(0, 0, 0, 1)"> System.Collections.Generic;
</span><span style="color: rgba(0, 0, 255, 1)">using</span><span style="color: rgba(0, 0, 0, 1)"> System.Text;
</span><span style="color: rgba(0, 0, 255, 1)">using</span><span style="color: rgba(0, 0, 0, 1)"> System.Threading;

</span><span style="color: rgba(0, 0, 255, 1)">namespace</span><span style="color: rgba(0, 0, 0, 1)"> RabbitMQ.ConsumeConsole
{
    </span><span style="color: rgba(0, 0, 255, 1)">class</span><span style="color: rgba(0, 0, 0, 1)"> Program
    {
      </span><span style="color: rgba(0, 0, 255, 1)">static</span> <span style="color: rgba(0, 0, 255, 1)">void</span> Main(<span style="color: rgba(0, 0, 255, 1)">string</span><span style="color: rgba(0, 0, 0, 1)">[] args)
      {
            </span><span style="color: rgba(0, 0, 255, 1)">string</span>[] hosts = <span style="color: rgba(0, 0, 255, 1)">new</span> <span style="color: rgba(0, 0, 255, 1)">string</span>[] { <span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">192.168.209.133</span><span style="color: rgba(128, 0, 0, 1)">"</span>, <span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">192.168.209.134</span><span style="color: rgba(128, 0, 0, 1)">"</span>, <span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">192.168.209.135</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)"> };
            </span><span style="color: rgba(0, 0, 255, 1)">int</span> port = <span style="color: rgba(128, 0, 128, 1)">5672</span><span style="color: rgba(0, 0, 0, 1)">;
            </span><span style="color: rgba(0, 0, 255, 1)">string</span> userName = <span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">admin</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">;
            </span><span style="color: rgba(0, 0, 255, 1)">string</span> password = <span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">123456</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">;
            </span><span style="color: rgba(0, 0, 255, 1)">string</span> virtualHost = <span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">/</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">;

            </span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">创建一个连接工厂</span>
            <span style="color: rgba(0, 0, 255, 1)">var</span> factory = <span style="color: rgba(0, 0, 255, 1)">new</span><span style="color: rgba(0, 0, 0, 1)"> ConnectionFactory();
            factory.UserName </span>=<span style="color: rgba(0, 0, 0, 1)"> userName;
            factory.Password </span>=<span style="color: rgba(0, 0, 0, 1)"> password;
            factory.Port </span>=<span style="color: rgba(0, 0, 0, 1)"> port;
            factory.VirtualHost </span>=<span style="color: rgba(0, 0, 0, 1)"> virtualHost;
            </span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">创建一个连接,此时可以在rabbitmq后台Web管理页面中的Connections中看到一个连接生成
            </span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">一个连接可以创建多个通道</span>
            <span style="color: rgba(0, 0, 255, 1)">var</span> connection =<span style="color: rgba(0, 0, 0, 1)"> factory.CreateConnection(hosts);

            Consumer(connection, </span><span style="color: rgba(128, 0, 128, 1)">1</span>);<span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">消费者1</span>
            Consumer(connection, <span style="color: rgba(128, 0, 128, 1)">2</span>);<span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">消费者2</span>
<span style="color: rgba(0, 0, 0, 1)">
            Console.ReadKey();
      }

      </span><span style="color: rgba(0, 0, 255, 1)">static</span> <span style="color: rgba(0, 0, 255, 1)">void</span> Consumer(IConnection connection, <span style="color: rgba(0, 0, 255, 1)">ushort</span><span style="color: rgba(0, 0, 0, 1)"> prefetch)
      {
            </span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">使用多线程来执行,可以模拟多个消费者</span>
            <span style="color: rgba(0, 0, 255, 1)">new</span> Thread(() =&gt;<span style="color: rgba(0, 0, 0, 1)">
            {
                </span><span style="color: rgba(0, 0, 255, 1)">int</span> threadId = Thread.CurrentThread.ManagedThreadId;<span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">线程Id,用于区分消费者</span>
                <span style="color: rgba(0, 0, 255, 1)">string</span> queue = <span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">queue1</span><span style="color: rgba(128, 0, 0, 1)">"</span>;<span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">队列名称

                </span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">创建一个通道
                </span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">此时可以在rabbitmq后台Web管理页面中的Channels中看到一个新通道生成</span>
                <span style="color: rgba(0, 0, 255, 1)">var</span> channel =<span style="color: rgba(0, 0, 0, 1)"> connection.CreateModel();
                </span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">给通道绑定一个队列,队列如果不存在,则会创建新队列,如果队列已存在,那么参数一定要正确,特别是arguments参数,否则会报错</span>
                <span style="color: rgba(0, 0, 255, 1)">var</span> arguments = <span style="color: rgba(0, 0, 255, 1)">new</span> Dictionary&lt;<span style="color: rgba(0, 0, 255, 1)">string</span>, <span style="color: rgba(0, 0, 255, 1)">object</span>&gt;() { { <span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">x-queue-type</span><span style="color: rgba(128, 0, 0, 1)">"</span>, <span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">classic</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)"> } };
                channel.QueueDeclare(queue: queue, durable: </span><span style="color: rgba(0, 0, 255, 1)">true</span>, exclusive: <span style="color: rgba(0, 0, 255, 1)">false</span>, autoDelete: <span style="color: rgba(0, 0, 255, 1)">false</span><span style="color: rgba(0, 0, 0, 1)">, arguments: arguments);
                </span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">设置消费者每次获取的消息数,可以用来设置消费者消息的权重
                </span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">必须等获取的消息都消费完成后才能重新获取</span>
                channel.BasicQos(<span style="color: rgba(128, 0, 128, 1)">0</span>, prefetch, <span style="color: rgba(0, 0, 255, 1)">true</span><span style="color: rgba(0, 0, 0, 1)">);

                </span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">在通道中定义一个事件消费者</span>
                EventingBasicConsumer consumer = <span style="color: rgba(0, 0, 255, 1)">new</span><span style="color: rgba(0, 0, 0, 1)"> EventingBasicConsumer(channel);
                consumer.Received </span>+= (sender, e) =&gt;<span style="color: rgba(0, 0, 0, 1)">
                {
                  </span><span style="color: rgba(0, 0, 255, 1)">string</span> message =<span style="color: rgba(0, 0, 0, 1)"> Encoding.UTF8.GetString(e.Body);
                  Console.WriteLine($</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">ThreadId:【{threadId}】 接收到消息:{message}</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">);

                  Thread.Sleep(</span><span style="color: rgba(128, 0, 128, 1)">500</span><span style="color: rgba(0, 0, 0, 1)">);

                  </span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">通知消息已被处理,如果没有,那么消息将会被重复消费</span>
                  channel.BasicAck(e.DeliveryTag, <span style="color: rgba(0, 0, 255, 1)">false</span><span style="color: rgba(0, 0, 0, 1)">);

                };
                </span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">ack设置成false,表示不自动提交,那么就需要在消息被消费后,手动调用BasicAck去提交消息</span>
                channel.BasicConsume(queue, <span style="color: rgba(0, 0, 255, 1)">false</span><span style="color: rgba(0, 0, 0, 1)">, consumer);
            }).Start();
      }
    }
}</span></pre>
</div>
<span class="cnblogs_code_collapse">RabbitMQ.ConsumeConsole</span></div>
<p>  <span style="color: rgba(0, 0, 255, 1)">另外说明一下,代码中提到rabbitmq的QOS机制,这里简单解释一下,当生产者将消息发布到rabbitmq之后,如果在未配置QOS的情况下,rabbitmq尽可能快速地发送队列中的所有消息到消费者端,如果消息比较多,消费者来不及处理,就会缓存这些消息,当消息堆积过多,可能导致服务器内存不足而影响其他进程,rabbitmq的QOS可以很好的解决这类问题,QOS就是限制消费者一次性从rabbitmq中获取消息的个数,而不是获取所有消息。比如设置rabbitmq的QOS为10,也就是prefetch=10,就是说,哪怕rabbitmq中有100条消息,消费者也只是一次性获取10条,然后消费者消费这10条消息,剩下的交给其他消费者,当10条消息中的unacked个数少于prefetch * 消费者数目时,会继续从rabbitmq获取消息,如果在工作模式中,不使用QOS,你会发现,所有的消息都被一个消费者消费了</span></p>
<p>  </p>
<hr>
<p>&nbsp;</p>
<p>  <strong><span style="font-size: 14pt"><span style="font-size: 18px">使用交换机情形</span></span></strong></p>
<p>  使用交换机的情形有3种:发布订阅模式,路由模式,主题模式</p>
<p>  上面说了,交换机是一个中介的角色,当一个交换机创建后,可以将其他队列或者交换机与当前交换机绑定,绑定时需要指定绑定路由规则,这个和交换机类型有关。</p>
<p>  当我们不使用交换机时,那么生产者是直接将消息发布到队列中去的,生产者只需要指定消息接收的队列即可,而使用交换机做中转时,生产者只需要将消息发布到交换机,然后交换机根据接收到的消息,按与交换机绑定的路由规则,将消息转发到其他交换机或者队列中,这个处理过程和交换机的类型有关,交换机一般分为4类:</p>
<p>  <strong>direct</strong>:直连类型,就是将消息的路由和交换机的绑定路由作比较,当两者一致时,则匹配成功,然后消息就会被转发到这个绑定路由后的队列或者交换机</p>
<p>  <strong>fanout</strong>:这种类型的交换机是不需要指定路由的,当交换机接收到消息时,会将消息广播到所有绑定到它的所有队列或交换机中</p>
<p>  <strong>topic</strong>:主题类型,类似direct类型,只不过在将消息的路由和绑定路由做比较时,是通过特定表达式去比较的,其中# 匹配一个或多个,* 匹配一个</p>
<p>  <strong>headers</strong>:头部交换机,允许使用消息头中的信息来做匹配规则,这个用的少,基本上不用,这里也就不过多介绍了</p>
<p>  到这里,你应该发觉,使用交换机的三种情形,无非就是使用交换机的类型不一样,发布订阅模式--<strong>fanout</strong>,路由模式--<strong>direct</strong>,主题模式--<strong>topic</strong></p>
<p>  现在我们先去rabbitmq的后台中,创建这几种交换机:</p>
<p>  <span style="color: rgba(0, 0, 255, 1)">交换机的创建及绑定都可以在代码中实现,如IModel类的QueueBind,ExchangeBind等方法,用多了就自然熟了,这里为了方便截图,就到后台去创建了</span></p>
<p>  <img src="https://img2018.cnblogs.com/blog/1033563/202001/1033563-20200102112710323-829178050.png" alt="" width="750"></p>
<p>&nbsp;   <span style="color: rgba(0, 0, 255, 1)">然后我们创建两个队列,并按指定类型分别绑定到这3个交换机中:</span></p>
<p><span style="color: rgba(0, 0, 255, 1)">   队列:</span></p>
<p>  <img src="https://img2018.cnblogs.com/blog/1033563/202001/1033563-20200102112852170-2043512988.png" alt="" width="750"></p>
<p>&nbsp;<span style="color: rgba(0, 0, 255, 1)">   demo.direct绑定队列规则:</span></p>
<p>   <img src="https://img2018.cnblogs.com/blog/1033563/202001/1033563-20200102135142172-2122595093.png" alt="" width="750"></p>
<p>&nbsp;  <span style="color: rgba(0, 0, 255, 1)">demo.fanout绑定队列规则:</span></p>
<p>  <img src="https://img2018.cnblogs.com/blog/1033563/202001/1033563-20200102113233303-2007914355.png" alt="" width="750"></p>
<p>&nbsp;  <span style="color: rgba(0, 0, 255, 1)">demo.topic绑定队列规则:</span></p>
<p>&nbsp;   <img src="https://img2018.cnblogs.com/blog/1033563/202001/1033563-20200102135109249-2032639525.png" alt="" width="750"></p>
<p>&nbsp;  上面所描述的,无非就是三种模式中发布消息方式的不一样,消费者当然还是从队列获取消息消费的,这里我们就先贴出消费者的代码:</p>
<div class="cnblogs_code">  <img src="https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif" alt="" id="code_img_closed_5ad3b5af-a9a1-42d7-ac65-708757395491" class="code_img_closed"><img src="https://images.cnblogs.com/OutliningIndicators/ExpandedBlockStart.gif" alt="" id="code_img_opened_5ad3b5af-a9a1-42d7-ac65-708757395491" class="code_img_opened" style="display: none">
<div id="cnblogs_code_open_5ad3b5af-a9a1-42d7-ac65-708757395491" class="cnblogs_code_hide">
<pre><span style="color: rgba(0, 0, 255, 1)">using</span><span style="color: rgba(0, 0, 0, 1)"> RabbitMQ.Client;
</span><span style="color: rgba(0, 0, 255, 1)">using</span><span style="color: rgba(0, 0, 0, 1)"> RabbitMQ.Client.Events;
</span><span style="color: rgba(0, 0, 255, 1)">using</span><span style="color: rgba(0, 0, 0, 1)"> System;
</span><span style="color: rgba(0, 0, 255, 1)">using</span><span style="color: rgba(0, 0, 0, 1)"> System.Collections.Generic;
</span><span style="color: rgba(0, 0, 255, 1)">using</span><span style="color: rgba(0, 0, 0, 1)"> System.Text;
</span><span style="color: rgba(0, 0, 255, 1)">using</span><span style="color: rgba(0, 0, 0, 1)"> System.Threading;

</span><span style="color: rgba(0, 0, 255, 1)">namespace</span><span style="color: rgba(0, 0, 0, 1)"> RabbitMQ.ConsumeConsole
{
    </span><span style="color: rgba(0, 0, 255, 1)">class</span><span style="color: rgba(0, 0, 0, 1)"> Program
    {
      </span><span style="color: rgba(0, 0, 255, 1)">static</span> <span style="color: rgba(0, 0, 255, 1)">void</span> Main(<span style="color: rgba(0, 0, 255, 1)">string</span><span style="color: rgba(0, 0, 0, 1)">[] args)
      {
            </span><span style="color: rgba(0, 0, 255, 1)">string</span>[] hosts = <span style="color: rgba(0, 0, 255, 1)">new</span> <span style="color: rgba(0, 0, 255, 1)">string</span>[] { <span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">192.168.209.133</span><span style="color: rgba(128, 0, 0, 1)">"</span>, <span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">192.168.209.134</span><span style="color: rgba(128, 0, 0, 1)">"</span>, <span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">192.168.209.135</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)"> };
            </span><span style="color: rgba(0, 0, 255, 1)">int</span> port = <span style="color: rgba(128, 0, 128, 1)">5672</span><span style="color: rgba(0, 0, 0, 1)">;
            </span><span style="color: rgba(0, 0, 255, 1)">string</span> userName = <span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">admin</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">;
            </span><span style="color: rgba(0, 0, 255, 1)">string</span> password = <span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">123456</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">;
            </span><span style="color: rgba(0, 0, 255, 1)">string</span> virtualHost = <span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">/</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">;

            </span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">创建一个连接工厂</span>
            <span style="color: rgba(0, 0, 255, 1)">var</span> factory = <span style="color: rgba(0, 0, 255, 1)">new</span><span style="color: rgba(0, 0, 0, 1)"> ConnectionFactory();
            factory.UserName </span>=<span style="color: rgba(0, 0, 0, 1)"> userName;
            factory.Password </span>=<span style="color: rgba(0, 0, 0, 1)"> password;
            factory.Port </span>=<span style="color: rgba(0, 0, 0, 1)"> port;
            factory.VirtualHost </span>=<span style="color: rgba(0, 0, 0, 1)"> virtualHost;
            </span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">创建一个连接,此时可以在rabbitmq后台Web管理页面中的Connections中看到一个连接生成
            </span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">一个连接可以创建多个通道</span>
            <span style="color: rgba(0, 0, 255, 1)">var</span> connection =<span style="color: rgba(0, 0, 0, 1)"> factory.CreateConnection(hosts);

            Consumer(connection, </span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">queue1</span><span style="color: rgba(128, 0, 0, 1)">"</span>);<span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">消费者1</span>
            Consumer(connection, <span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">queue2</span><span style="color: rgba(128, 0, 0, 1)">"</span>);<span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">消费者2</span>
<span style="color: rgba(0, 0, 0, 1)">
            Console.ReadKey();
      }

      </span><span style="color: rgba(0, 0, 255, 1)">static</span> <span style="color: rgba(0, 0, 255, 1)">void</span> Consumer(IConnection connection, <span style="color: rgba(0, 0, 255, 1)">string</span><span style="color: rgba(0, 0, 0, 1)"> queue)
      {
            </span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">使用多线程来执行,可以模拟多个消费者</span>
            <span style="color: rgba(0, 0, 255, 1)">new</span> Thread(() =&gt;<span style="color: rgba(0, 0, 0, 1)">
            {
                </span><span style="color: rgba(0, 0, 255, 1)">int</span> threadId = Thread.CurrentThread.ManagedThreadId;<span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">线程Id,用于区分消费者

                </span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">创建一个通道
                </span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">此时可以在rabbitmq后台Web管理页面中的Channels中看到一个新通道生成</span>
                <span style="color: rgba(0, 0, 255, 1)">var</span> channel =<span style="color: rgba(0, 0, 0, 1)"> connection.CreateModel();
                </span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">给通道绑定一个队列,队列如果不存在,则会创建新队列,如果队列已存在,那么参数一定要正确,特别是arguments参数,否则会报错</span>
                <span style="color: rgba(0, 0, 255, 1)">var</span> arguments = <span style="color: rgba(0, 0, 255, 1)">new</span> Dictionary&lt;<span style="color: rgba(0, 0, 255, 1)">string</span>, <span style="color: rgba(0, 0, 255, 1)">object</span>&gt;() { { <span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">x-queue-type</span><span style="color: rgba(128, 0, 0, 1)">"</span>, <span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">classic</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)"> } };
                channel.QueueDeclare(queue: queue, durable: </span><span style="color: rgba(0, 0, 255, 1)">true</span>, exclusive: <span style="color: rgba(0, 0, 255, 1)">false</span>, autoDelete: <span style="color: rgba(0, 0, 255, 1)">false</span><span style="color: rgba(0, 0, 0, 1)">, arguments: arguments);

                </span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">在通道中定义一个事件消费者</span>
                EventingBasicConsumer consumer = <span style="color: rgba(0, 0, 255, 1)">new</span><span style="color: rgba(0, 0, 0, 1)"> EventingBasicConsumer(channel);
                consumer.Received </span>+= (sender, e) =&gt;<span style="color: rgba(0, 0, 0, 1)">
                {
                  </span><span style="color: rgba(0, 0, 255, 1)">string</span> message =<span style="color: rgba(0, 0, 0, 1)"> Encoding.UTF8.GetString(e.Body);
                  Console.WriteLine($</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">ThreadId:【{threadId}】 接收到消息:{message}</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">);

                  Thread.Sleep(</span><span style="color: rgba(128, 0, 128, 1)">500</span><span style="color: rgba(0, 0, 0, 1)">);

                  </span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">通知消息已被处理,如果没有,那么消息将会被重复消费</span>
                  channel.BasicAck(e.DeliveryTag, <span style="color: rgba(0, 0, 255, 1)">false</span><span style="color: rgba(0, 0, 0, 1)">);
                };
                </span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">ack设置成false,表示不自动提交,那么就需要在消息被消费后,手动调用BasicAck去提交消息</span>
                channel.BasicConsume(queue, <span style="color: rgba(0, 0, 255, 1)">false</span><span style="color: rgba(0, 0, 0, 1)">, consumer);
            }).Start();
      }
    }
}</span></pre>
</div>
<span class="cnblogs_code_collapse">RabbitMQ.ConsumeConsole</span></div>
<p>  这里我们使用了两个队列,每个队列我们这里只用了一个消费者,对于下面几种模式,这个消费者代码都能消费到</p>
<p>  <strong><span style="font-size: 16px">发布订阅模式</span></strong></p>
<p>  发布订阅模式使用的是fanout类型的交换机,这个类型无需指定路由,交换机会将消息广播到每个绑定到交换机的队列或者交换机  </p>
<p>   <img src="https://img2018.cnblogs.com/blog/1033563/202001/1033563-20200102153646659-1444892273.png" alt="" width="300"></p>
<div class="cnblogs_code">  <img src="https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif" alt="" id="code_img_closed_33c60d6a-c0ec-4b0b-98ca-cfe4d567db53" class="code_img_closed"><img src="https://images.cnblogs.com/OutliningIndicators/ExpandedBlockStart.gif" alt="" id="code_img_opened_33c60d6a-c0ec-4b0b-98ca-cfe4d567db53" class="code_img_opened" style="display: none">
<div id="cnblogs_code_open_33c60d6a-c0ec-4b0b-98ca-cfe4d567db53" class="cnblogs_code_hide">
<pre><span style="color: rgba(0, 0, 255, 1)">using</span><span style="color: rgba(0, 0, 0, 1)"> RabbitMQ.Client;
</span><span style="color: rgba(0, 0, 255, 1)">using</span><span style="color: rgba(0, 0, 0, 1)"> System;
</span><span style="color: rgba(0, 0, 255, 1)">using</span><span style="color: rgba(0, 0, 0, 1)"> System.Collections.Generic;
</span><span style="color: rgba(0, 0, 255, 1)">using</span><span style="color: rgba(0, 0, 0, 1)"> System.Text;

</span><span style="color: rgba(0, 0, 255, 1)">namespace</span><span style="color: rgba(0, 0, 0, 1)"> RabbitMQ.PublishConsole
{
    </span><span style="color: rgba(0, 0, 255, 1)">class</span><span style="color: rgba(0, 0, 0, 1)"> Program
    {
      </span><span style="color: rgba(0, 0, 255, 1)">static</span> <span style="color: rgba(0, 0, 255, 1)">void</span> Main(<span style="color: rgba(0, 0, 255, 1)">string</span><span style="color: rgba(0, 0, 0, 1)">[] args)
      {
            </span><span style="color: rgba(0, 0, 255, 1)">string</span>[] hosts = <span style="color: rgba(0, 0, 255, 1)">new</span> <span style="color: rgba(0, 0, 255, 1)">string</span>[] { <span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">192.168.209.133</span><span style="color: rgba(128, 0, 0, 1)">"</span>, <span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">192.168.209.134</span><span style="color: rgba(128, 0, 0, 1)">"</span>, <span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">192.168.209.135</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)"> };
            </span><span style="color: rgba(0, 0, 255, 1)">int</span> port = <span style="color: rgba(128, 0, 128, 1)">5672</span><span style="color: rgba(0, 0, 0, 1)">;
            </span><span style="color: rgba(0, 0, 255, 1)">string</span> userName = <span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">admin</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">;
            </span><span style="color: rgba(0, 0, 255, 1)">string</span> password = <span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">123456</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">;
            </span><span style="color: rgba(0, 0, 255, 1)">string</span> virtualHost = <span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">/</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">;

            </span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">创建一个连接工厂</span>
            <span style="color: rgba(0, 0, 255, 1)">var</span> factory = <span style="color: rgba(0, 0, 255, 1)">new</span><span style="color: rgba(0, 0, 0, 1)"> ConnectionFactory();
            factory.UserName </span>=<span style="color: rgba(0, 0, 0, 1)"> userName;
            factory.Password </span>=<span style="color: rgba(0, 0, 0, 1)"> password;
            factory.Port </span>=<span style="color: rgba(0, 0, 0, 1)"> port;
            factory.VirtualHost </span>=<span style="color: rgba(0, 0, 0, 1)"> virtualHost;
            </span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">创建一个连接,此时可以在rabbitmq后台Web管理页面中的Connections中看到一个连接生成
            </span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">一个连接可以创建多个通道</span>
            <span style="color: rgba(0, 0, 255, 1)">var</span> connection =<span style="color: rgba(0, 0, 0, 1)"> factory.CreateConnection(hosts);

            </span><span style="color: rgba(0, 0, 255, 1)">string</span> exchange = <span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">demo.fanout</span><span style="color: rgba(128, 0, 0, 1)">"</span>;<span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">交换机名称</span>
            <span style="color: rgba(0, 0, 255, 1)">string</span> exchangeType = <span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">fanout</span><span style="color: rgba(128, 0, 0, 1)">"</span>;<span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">交换机类型

            </span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">创建一个通道
            </span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">此时可以在rabbitmq后台Web管理页面中的Channels中看到一个新通道生成</span>
            <span style="color: rgba(0, 0, 255, 1)">var</span> channel =<span style="color: rgba(0, 0, 0, 1)"> connection.CreateModel();
            </span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">给通道绑定一个交换机,交换机如果不存在,则会创建新交换机,如果交换机已存在,那么参数一定要正确,特别是arguments参数,各参数类似队列</span>
            <span style="color: rgba(0, 0, 255, 1)">var</span> arguments = <span style="color: rgba(0, 0, 255, 1)">new</span> Dictionary&lt;<span style="color: rgba(0, 0, 255, 1)">string</span>, <span style="color: rgba(0, 0, 255, 1)">object</span>&gt;<span style="color: rgba(0, 0, 0, 1)">() { };
            channel.ExchangeDeclare(exchange: exchange, type: exchangeType, durable: </span><span style="color: rgba(0, 0, 255, 1)">true</span>, autoDelete: <span style="color: rgba(0, 0, 255, 1)">false</span><span style="color: rgba(0, 0, 0, 1)">, arguments: arguments);
            
            </span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">发布10条消息</span>
            <span style="color: rgba(0, 0, 255, 1)">for</span> (<span style="color: rgba(0, 0, 255, 1)">var</span> i = <span style="color: rgba(128, 0, 128, 1)">0</span>; i &lt; <span style="color: rgba(128, 0, 128, 1)">10</span>; i++<span style="color: rgba(0, 0, 0, 1)">)
            {
                </span><span style="color: rgba(0, 0, 255, 1)">var</span> buffer =<span style="color: rgba(0, 0, 0, 1)"> Encoding.UTF8.GetBytes(i.ToString());
                channel.BasicPublish(exchange, </span><span style="color: rgba(128, 0, 0, 1)">""</span>, <span style="color: rgba(0, 0, 255, 1)">null</span><span style="color: rgba(0, 0, 0, 1)">, buffer);
            }
            channel.Close();

            Console.ReadKey();
      }
    }
}</span></pre>
</div>
<span class="cnblogs_code_collapse">RabbitMQ.PublishConsole</span></div>
<p>  代码中,我们往交换机发布了10条消息,交换机接收到消息后,会将消息转发到queue1和queue2,因此,queue1和queue2都会收到10条消息:</p>
<p>  <img src="https://img2018.cnblogs.com/blog/1033563/202001/1033563-20200102140017410-1776593406.png" alt="" width="750"></p>
<p>  <strong><span style="font-size: 16px">路由模式</span></strong></p>
<p>  路由模式使用的是direct类型的交换机,也即在进行路由匹配时,需要匹配的路由一直才算匹配成功,我们把发布订阅模式的代码稍作修改即可,贴出生产者部分代码:  </p>
<p>  <img src="https://img2018.cnblogs.com/blog/1033563/202001/1033563-20200102153855775-103551063.png" alt="" width="300"> </p>
<div class="cnblogs_code">  <img src="https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif" alt="" id="code_img_closed_85a4cedf-b8c3-4a2c-a25a-366199a6dd2e" class="code_img_closed"><img src="https://images.cnblogs.com/OutliningIndicators/ExpandedBlockStart.gif" alt="" id="code_img_opened_85a4cedf-b8c3-4a2c-a25a-366199a6dd2e" class="code_img_opened" style="display: none">
<div id="cnblogs_code_open_85a4cedf-b8c3-4a2c-a25a-366199a6dd2e" class="cnblogs_code_hide">
<pre><span style="color: rgba(0, 0, 255, 1)">using</span><span style="color: rgba(0, 0, 0, 1)"> RabbitMQ.Client;
</span><span style="color: rgba(0, 0, 255, 1)">using</span><span style="color: rgba(0, 0, 0, 1)"> System;
</span><span style="color: rgba(0, 0, 255, 1)">using</span><span style="color: rgba(0, 0, 0, 1)"> System.Collections.Generic;
</span><span style="color: rgba(0, 0, 255, 1)">using</span><span style="color: rgba(0, 0, 0, 1)"> System.Text;

</span><span style="color: rgba(0, 0, 255, 1)">namespace</span><span style="color: rgba(0, 0, 0, 1)"> RabbitMQ.PublishConsole
{
    </span><span style="color: rgba(0, 0, 255, 1)">class</span><span style="color: rgba(0, 0, 0, 1)"> Program
    {
      </span><span style="color: rgba(0, 0, 255, 1)">static</span> <span style="color: rgba(0, 0, 255, 1)">void</span> Main(<span style="color: rgba(0, 0, 255, 1)">string</span><span style="color: rgba(0, 0, 0, 1)">[] args)
      {
            </span><span style="color: rgba(0, 0, 255, 1)">string</span>[] hosts = <span style="color: rgba(0, 0, 255, 1)">new</span> <span style="color: rgba(0, 0, 255, 1)">string</span>[] { <span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">192.168.209.133</span><span style="color: rgba(128, 0, 0, 1)">"</span>, <span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">192.168.209.134</span><span style="color: rgba(128, 0, 0, 1)">"</span>, <span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">192.168.209.135</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)"> };
            </span><span style="color: rgba(0, 0, 255, 1)">int</span> port = <span style="color: rgba(128, 0, 128, 1)">5672</span><span style="color: rgba(0, 0, 0, 1)">;
            </span><span style="color: rgba(0, 0, 255, 1)">string</span> userName = <span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">admin</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">;
            </span><span style="color: rgba(0, 0, 255, 1)">string</span> password = <span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">123456</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">;
            </span><span style="color: rgba(0, 0, 255, 1)">string</span> virtualHost = <span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">/</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">;

            </span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">创建一个连接工厂</span>
            <span style="color: rgba(0, 0, 255, 1)">var</span> factory = <span style="color: rgba(0, 0, 255, 1)">new</span><span style="color: rgba(0, 0, 0, 1)"> ConnectionFactory();
            factory.UserName </span>=<span style="color: rgba(0, 0, 0, 1)"> userName;
            factory.Password </span>=<span style="color: rgba(0, 0, 0, 1)"> password;
            factory.Port </span>=<span style="color: rgba(0, 0, 0, 1)"> port;
            factory.VirtualHost </span>=<span style="color: rgba(0, 0, 0, 1)"> virtualHost;
            </span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">创建一个连接,此时可以在rabbitmq后台Web管理页面中的Connections中看到一个连接生成
            </span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">一个连接可以创建多个通道</span>
            <span style="color: rgba(0, 0, 255, 1)">var</span> connection =<span style="color: rgba(0, 0, 0, 1)"> factory.CreateConnection(hosts);

            </span><span style="color: rgba(0, 0, 255, 1)">string</span> exchange = <span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">demo.direct</span><span style="color: rgba(128, 0, 0, 1)">"</span>;<span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">交换机名称</span>
            <span style="color: rgba(0, 0, 255, 1)">string</span> exchangeType = <span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">direct</span><span style="color: rgba(128, 0, 0, 1)">"</span>;<span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">交换机类型

            </span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">创建一个通道
            </span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">此时可以在rabbitmq后台Web管理页面中的Channels中看到一个新通道生成</span>
            <span style="color: rgba(0, 0, 255, 1)">var</span> channel =<span style="color: rgba(0, 0, 0, 1)"> connection.CreateModel();
            </span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">给通道绑定一个交换机,交换机如果不存在,则会创建新交换机,如果交换机已存在,那么参数一定要正确,特别是arguments参数,各参数类似队列</span>
            <span style="color: rgba(0, 0, 255, 1)">var</span> arguments = <span style="color: rgba(0, 0, 255, 1)">new</span> Dictionary&lt;<span style="color: rgba(0, 0, 255, 1)">string</span>, <span style="color: rgba(0, 0, 255, 1)">object</span>&gt;<span style="color: rgba(0, 0, 0, 1)">() { };
            channel.ExchangeDeclare(exchange: exchange, type: exchangeType, durable: </span><span style="color: rgba(0, 0, 255, 1)">true</span>, autoDelete: <span style="color: rgba(0, 0, 255, 1)">false</span><span style="color: rgba(0, 0, 0, 1)">, arguments: arguments);

            </span><span style="color: rgba(0, 0, 255, 1)">string</span>[] routes = <span style="color: rgba(0, 0, 255, 1)">new</span> <span style="color: rgba(0, 0, 255, 1)">string</span>[] { <span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">apple</span><span style="color: rgba(128, 0, 0, 1)">"</span>, <span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">banana</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)"> };

            </span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">发布10条消息</span>
            <span style="color: rgba(0, 0, 255, 1)">for</span> (<span style="color: rgba(0, 0, 255, 1)">var</span> i = <span style="color: rgba(128, 0, 128, 1)">0</span>; i &lt; <span style="color: rgba(128, 0, 128, 1)">10</span>; i++<span style="color: rgba(0, 0, 0, 1)">)
            {
                </span><span style="color: rgba(0, 0, 255, 1)">var</span> buffer =<span style="color: rgba(0, 0, 0, 1)"> Encoding.UTF8.GetBytes(i.ToString());
                channel.BasicPublish(exchange, routes, <span style="color: rgba(0, 0, 255, 1)">null</span><span style="color: rgba(0, 0, 0, 1)">, buffer);
            }
            channel.Close();

            Console.ReadKey();
      }
    }
}</span></pre>
</div>
<span class="cnblogs_code_collapse">RabbitMQ.PublishConsole</span></div>
<p>  代码中,我们往demo.direct交换机发布了10条消息,其中5条消息的路由是apple,另外5条消息的路由是banana,demo.direct交换机绑定的两个队列中,queue1的绑定路由是apple,queue2的绑定路由是banana,那么demo.direct交换机会将路由是apple的消息转发到queue1,将路由是banana的消息转发到queue2,从后台可以看每个队列中已经有5个消息准备好了:</p>
<p>  <img src="https://img2018.cnblogs.com/blog/1033563/202001/1033563-20200102115630567-1991776262.png" alt="" width="750"></p>
<p>&nbsp;   接下来可以使用消费者将它们消费掉</p>
<p>  <strong><span style="font-size: 16px">主题模式</span></strong></p>
<p>&nbsp;  主题模式使用的topic类型的交换机,在进行匹配时,是根据表达式去匹配,# 匹配一个或多个,* 匹配一个,我们将路由模式的代码稍作修改:    </p>
<p>  <img src="https://img2018.cnblogs.com/blog/1033563/202001/1033563-20200102153758663-812956356.png" alt="" width="300"></p>
<div class="cnblogs_code">  <img src="https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif" alt="" id="code_img_closed_7e378a93-2bd6-4d60-a5f3-583128ab8bac" class="code_img_closed"><img src="https://images.cnblogs.com/OutliningIndicators/ExpandedBlockStart.gif" alt="" id="code_img_opened_7e378a93-2bd6-4d60-a5f3-583128ab8bac" class="code_img_opened" style="display: none">
<div id="cnblogs_code_open_7e378a93-2bd6-4d60-a5f3-583128ab8bac" class="cnblogs_code_hide">
<pre><span style="color: rgba(0, 0, 255, 1)">using</span><span style="color: rgba(0, 0, 0, 1)"> RabbitMQ.Client;
</span><span style="color: rgba(0, 0, 255, 1)">using</span><span style="color: rgba(0, 0, 0, 1)"> System;
</span><span style="color: rgba(0, 0, 255, 1)">using</span><span style="color: rgba(0, 0, 0, 1)"> System.Collections.Generic;
</span><span style="color: rgba(0, 0, 255, 1)">using</span><span style="color: rgba(0, 0, 0, 1)"> System.Text;

</span><span style="color: rgba(0, 0, 255, 1)">namespace</span><span style="color: rgba(0, 0, 0, 1)"> RabbitMQ.PublishConsole
{
    </span><span style="color: rgba(0, 0, 255, 1)">class</span><span style="color: rgba(0, 0, 0, 1)"> Program
    {
      </span><span style="color: rgba(0, 0, 255, 1)">static</span> <span style="color: rgba(0, 0, 255, 1)">void</span> Main(<span style="color: rgba(0, 0, 255, 1)">string</span><span style="color: rgba(0, 0, 0, 1)">[] args)
      {
            </span><span style="color: rgba(0, 0, 255, 1)">string</span>[] hosts = <span style="color: rgba(0, 0, 255, 1)">new</span> <span style="color: rgba(0, 0, 255, 1)">string</span>[] { <span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">192.168.209.133</span><span style="color: rgba(128, 0, 0, 1)">"</span>, <span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">192.168.209.134</span><span style="color: rgba(128, 0, 0, 1)">"</span>, <span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">192.168.209.135</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)"> };
            </span><span style="color: rgba(0, 0, 255, 1)">int</span> port = <span style="color: rgba(128, 0, 128, 1)">5672</span><span style="color: rgba(0, 0, 0, 1)">;
            </span><span style="color: rgba(0, 0, 255, 1)">string</span> userName = <span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">admin</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">;
            </span><span style="color: rgba(0, 0, 255, 1)">string</span> password = <span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">123456</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">;
            </span><span style="color: rgba(0, 0, 255, 1)">string</span> virtualHost = <span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">/</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">;

            </span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">创建一个连接工厂</span>
            <span style="color: rgba(0, 0, 255, 1)">var</span> factory = <span style="color: rgba(0, 0, 255, 1)">new</span><span style="color: rgba(0, 0, 0, 1)"> ConnectionFactory();
            factory.UserName </span>=<span style="color: rgba(0, 0, 0, 1)"> userName;
            factory.Password </span>=<span style="color: rgba(0, 0, 0, 1)"> password;
            factory.Port </span>=<span style="color: rgba(0, 0, 0, 1)"> port;
            factory.VirtualHost </span>=<span style="color: rgba(0, 0, 0, 1)"> virtualHost;
            </span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">创建一个连接,此时可以在rabbitmq后台Web管理页面中的Connections中看到一个连接生成
            </span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">一个连接可以创建多个通道</span>
            <span style="color: rgba(0, 0, 255, 1)">var</span> connection =<span style="color: rgba(0, 0, 0, 1)"> factory.CreateConnection(hosts);

            </span><span style="color: rgba(0, 0, 255, 1)">string</span> exchange = <span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">demo.topic</span><span style="color: rgba(128, 0, 0, 1)">"</span>;<span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">交换机名称</span>
            <span style="color: rgba(0, 0, 255, 1)">string</span> exchangeType = <span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">topic</span><span style="color: rgba(128, 0, 0, 1)">"</span>;<span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">交换机类型

            </span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">创建一个通道
            </span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">此时可以在rabbitmq后台Web管理页面中的Channels中看到一个新通道生成</span>
            <span style="color: rgba(0, 0, 255, 1)">var</span> channel =<span style="color: rgba(0, 0, 0, 1)"> connection.CreateModel();
            </span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">给通道绑定一个交换机,交换机如果不存在,则会创建新交换机,如果交换机已存在,那么参数一定要正确,特别是arguments参数,各参数类似队列</span>
            <span style="color: rgba(0, 0, 255, 1)">var</span> arguments = <span style="color: rgba(0, 0, 255, 1)">new</span> Dictionary&lt;<span style="color: rgba(0, 0, 255, 1)">string</span>, <span style="color: rgba(0, 0, 255, 1)">object</span>&gt;<span style="color: rgba(0, 0, 0, 1)">() { };
            channel.ExchangeDeclare(exchange: exchange, type: exchangeType, durable: </span><span style="color: rgba(0, 0, 255, 1)">true</span>, autoDelete: <span style="color: rgba(0, 0, 255, 1)">false</span><span style="color: rgba(0, 0, 0, 1)">, arguments: arguments);

            </span><span style="color: rgba(0, 0, 255, 1)">string</span>[] routes = <span style="color: rgba(0, 0, 255, 1)">new</span> <span style="color: rgba(0, 0, 255, 1)">string</span>[] { <span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">apple.</span><span style="color: rgba(128, 0, 0, 1)">"</span>, <span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">banana.</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)"> };

            </span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">发布10条消息</span>
            <span style="color: rgba(0, 0, 255, 1)">for</span> (<span style="color: rgba(0, 0, 255, 1)">var</span> i = <span style="color: rgba(128, 0, 128, 1)">0</span>; i &lt; <span style="color: rgba(128, 0, 128, 1)">10</span>; i++<span style="color: rgba(0, 0, 0, 1)">)
            {
                </span><span style="color: rgba(0, 0, 255, 1)">var</span> buffer =<span style="color: rgba(0, 0, 0, 1)"> Encoding.UTF8.GetBytes(i.ToString());
                channel.BasicPublish(exchange, routes + i, <span style="color: rgba(0, 0, 255, 1)">null</span><span style="color: rgba(0, 0, 0, 1)">, buffer);
            }
            channel.Close();

            Console.ReadKey();
      }
    }
}</span></pre>
</div>
<span class="cnblogs_code_collapse">RabbitMQ.PublishConsole</span></div>
<p>  代码中,我们往demo.topic交换机中发布了10条消息,其中5条消息的路由是以apple开头的,另外5条消息的路由是以banana开头的,demo.direct交换机绑定的两个队列中,queue1的绑定路由是apple.#,就是匹配以apple开头的路由,queue2的绑定路由是banana.#,就是匹配以banana开头的路由,那么demo.direct交换机会将路由是以apple开头的的消息转发到queue1,将路由是以banana开头的的消息转发到queue2,从后台可以看每个队列中已经有5个消息准备好了:</p>
<p>  <img src="https://img2018.cnblogs.com/blog/1033563/202001/1033563-20200102135234436-1556228163.png" alt="" width="750"></p>
<p>&nbsp;   </p>
<hr>
<p>&nbsp;</p>
<p>  <strong><span style="font-size: 14pt">封装</span></strong></p>
<p>  其实rabbitmq的使用还是比较简单的,只需要多谢谢代码尝试一下就能熟悉</p>
<p>  一般的,像这种第三方插件的调用,我建议自己要做一层封装,最好是根据自己的需求去封装,然后项目中只需要调用自己封装的类就行了,下面贴出我自己封装的类:  </p>
<div class="cnblogs_code">  <img src="https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif" alt="" id="code_img_closed_03947dd1-e44a-4927-96e0-a659a194d0db" class="code_img_closed"><img src="https://images.cnblogs.com/OutliningIndicators/ExpandedBlockStart.gif" alt="" id="code_img_opened_03947dd1-e44a-4927-96e0-a659a194d0db" class="code_img_opened" style="display: none">
<div id="cnblogs_code_open_03947dd1-e44a-4927-96e0-a659a194d0db" class="cnblogs_code_hide">
<pre><span style="color: rgba(0, 0, 255, 1)">using</span><span style="color: rgba(0, 0, 0, 1)"> System;
</span><span style="color: rgba(0, 0, 255, 1)">using</span><span style="color: rgba(0, 0, 0, 1)"> System.Collections.Generic;
</span><span style="color: rgba(0, 0, 255, 1)">using</span><span style="color: rgba(0, 0, 0, 1)"> System.Text;

</span><span style="color: rgba(0, 0, 255, 1)">namespace</span><span style="color: rgba(0, 0, 0, 1)"> RabbitMQ.ConsoleApp
{
    </span><span style="color: rgba(0, 0, 255, 1)">public</span> <span style="color: rgba(0, 0, 255, 1)">class</span><span style="color: rgba(0, 0, 0, 1)"> QueueOptions
    {
      </span><span style="color: rgba(128, 128, 128, 1)">///</span> <span style="color: rgba(128, 128, 128, 1)">&lt;summary&gt;</span>
      <span style="color: rgba(128, 128, 128, 1)">///</span><span style="color: rgba(0, 128, 0, 1)"> 是否持久化
      </span><span style="color: rgba(128, 128, 128, 1)">///</span> <span style="color: rgba(128, 128, 128, 1)">&lt;/summary&gt;</span>
      <span style="color: rgba(0, 0, 255, 1)">public</span> <span style="color: rgba(0, 0, 255, 1)">bool</span> Durable { <span style="color: rgba(0, 0, 255, 1)">get</span>; <span style="color: rgba(0, 0, 255, 1)">set</span>; } = <span style="color: rgba(0, 0, 255, 1)">true</span><span style="color: rgba(0, 0, 0, 1)">;
      </span><span style="color: rgba(128, 128, 128, 1)">///</span> <span style="color: rgba(128, 128, 128, 1)">&lt;summary&gt;</span>
      <span style="color: rgba(128, 128, 128, 1)">///</span><span style="color: rgba(0, 128, 0, 1)"> 是否自动删除
      </span><span style="color: rgba(128, 128, 128, 1)">///</span> <span style="color: rgba(128, 128, 128, 1)">&lt;/summary&gt;</span>
      <span style="color: rgba(0, 0, 255, 1)">public</span> <span style="color: rgba(0, 0, 255, 1)">bool</span> AutoDelete { <span style="color: rgba(0, 0, 255, 1)">get</span>; <span style="color: rgba(0, 0, 255, 1)">set</span>; } = <span style="color: rgba(0, 0, 255, 1)">false</span><span style="color: rgba(0, 0, 0, 1)">;
      </span><span style="color: rgba(128, 128, 128, 1)">///</span> <span style="color: rgba(128, 128, 128, 1)">&lt;summary&gt;</span>
      <span style="color: rgba(128, 128, 128, 1)">///</span><span style="color: rgba(0, 128, 0, 1)"> 参数
      </span><span style="color: rgba(128, 128, 128, 1)">///</span> <span style="color: rgba(128, 128, 128, 1)">&lt;/summary&gt;</span>
      <span style="color: rgba(0, 0, 255, 1)">public</span> IDictionary&lt;<span style="color: rgba(0, 0, 255, 1)">string</span>, <span style="color: rgba(0, 0, 255, 1)">object</span>&gt; Arguments { <span style="color: rgba(0, 0, 255, 1)">get</span>; <span style="color: rgba(0, 0, 255, 1)">set</span>; } = <span style="color: rgba(0, 0, 255, 1)">new</span> Dictionary&lt;<span style="color: rgba(0, 0, 255, 1)">string</span>, <span style="color: rgba(0, 0, 255, 1)">object</span>&gt;<span style="color: rgba(0, 0, 0, 1)">();
    }
    </span><span style="color: rgba(0, 0, 255, 1)">public</span> <span style="color: rgba(0, 0, 255, 1)">class</span><span style="color: rgba(0, 0, 0, 1)"> ConsumeQueueOptions : QueueOptions
    {
      </span><span style="color: rgba(128, 128, 128, 1)">///</span> <span style="color: rgba(128, 128, 128, 1)">&lt;summary&gt;</span>
      <span style="color: rgba(128, 128, 128, 1)">///</span><span style="color: rgba(0, 128, 0, 1)"> 是否自动提交
      </span><span style="color: rgba(128, 128, 128, 1)">///</span> <span style="color: rgba(128, 128, 128, 1)">&lt;/summary&gt;</span>
      <span style="color: rgba(0, 0, 255, 1)">public</span> <span style="color: rgba(0, 0, 255, 1)">bool</span> AutoAck { <span style="color: rgba(0, 0, 255, 1)">get</span>; <span style="color: rgba(0, 0, 255, 1)">set</span>; } = <span style="color: rgba(0, 0, 255, 1)">false</span><span style="color: rgba(0, 0, 0, 1)">;
      </span><span style="color: rgba(128, 128, 128, 1)">///</span> <span style="color: rgba(128, 128, 128, 1)">&lt;summary&gt;</span>
      <span style="color: rgba(128, 128, 128, 1)">///</span><span style="color: rgba(0, 128, 0, 1)"> 每次发送消息条数
      </span><span style="color: rgba(128, 128, 128, 1)">///</span> <span style="color: rgba(128, 128, 128, 1)">&lt;/summary&gt;</span>
      <span style="color: rgba(0, 0, 255, 1)">public</span> <span style="color: rgba(0, 0, 255, 1)">ushort</span>? FetchCount { <span style="color: rgba(0, 0, 255, 1)">get</span>; <span style="color: rgba(0, 0, 255, 1)">set</span><span style="color: rgba(0, 0, 0, 1)">; }
    }
    </span><span style="color: rgba(0, 0, 255, 1)">public</span> <span style="color: rgba(0, 0, 255, 1)">class</span><span style="color: rgba(0, 0, 0, 1)"> ExchangeConsumeQueueOptions : ConsumeQueueOptions
    {
      </span><span style="color: rgba(128, 128, 128, 1)">///</span> <span style="color: rgba(128, 128, 128, 1)">&lt;summary&gt;</span>
      <span style="color: rgba(128, 128, 128, 1)">///</span><span style="color: rgba(0, 128, 0, 1)"> 路由值
      </span><span style="color: rgba(128, 128, 128, 1)">///</span> <span style="color: rgba(128, 128, 128, 1)">&lt;/summary&gt;</span>
      <span style="color: rgba(0, 0, 255, 1)">public</span> <span style="color: rgba(0, 0, 255, 1)">string</span>[] RoutingKeys { <span style="color: rgba(0, 0, 255, 1)">get</span>; <span style="color: rgba(0, 0, 255, 1)">set</span><span style="color: rgba(0, 0, 0, 1)">; }
      </span><span style="color: rgba(128, 128, 128, 1)">///</span> <span style="color: rgba(128, 128, 128, 1)">&lt;summary&gt;</span>
      <span style="color: rgba(128, 128, 128, 1)">///</span><span style="color: rgba(0, 128, 0, 1)"> 参数
      </span><span style="color: rgba(128, 128, 128, 1)">///</span> <span style="color: rgba(128, 128, 128, 1)">&lt;/summary&gt;</span>
      <span style="color: rgba(0, 0, 255, 1)">public</span> IDictionary&lt;<span style="color: rgba(0, 0, 255, 1)">string</span>, <span style="color: rgba(0, 0, 255, 1)">object</span>&gt; BindArguments { <span style="color: rgba(0, 0, 255, 1)">get</span>; <span style="color: rgba(0, 0, 255, 1)">set</span>; } = <span style="color: rgba(0, 0, 255, 1)">new</span> Dictionary&lt;<span style="color: rgba(0, 0, 255, 1)">string</span>, <span style="color: rgba(0, 0, 255, 1)">object</span>&gt;<span style="color: rgba(0, 0, 0, 1)">();
    }
    </span><span style="color: rgba(0, 0, 255, 1)">public</span> <span style="color: rgba(0, 0, 255, 1)">class</span><span style="color: rgba(0, 0, 0, 1)"> ExchangeQueueOptions : QueueOptions
    {
      </span><span style="color: rgba(128, 128, 128, 1)">///</span> <span style="color: rgba(128, 128, 128, 1)">&lt;summary&gt;</span>
      <span style="color: rgba(128, 128, 128, 1)">///</span><span style="color: rgba(0, 128, 0, 1)"> 交换机类型
      </span><span style="color: rgba(128, 128, 128, 1)">///</span> <span style="color: rgba(128, 128, 128, 1)">&lt;/summary&gt;</span>
      <span style="color: rgba(0, 0, 255, 1)">public</span> <span style="color: rgba(0, 0, 255, 1)">string</span> Type { <span style="color: rgba(0, 0, 255, 1)">get</span>; <span style="color: rgba(0, 0, 255, 1)">set</span><span style="color: rgba(0, 0, 0, 1)">; }
      </span><span style="color: rgba(128, 128, 128, 1)">///</span> <span style="color: rgba(128, 128, 128, 1)">&lt;summary&gt;</span>
      <span style="color: rgba(128, 128, 128, 1)">///</span><span style="color: rgba(0, 128, 0, 1)"> 队列及路由值
      </span><span style="color: rgba(128, 128, 128, 1)">///</span> <span style="color: rgba(128, 128, 128, 1)">&lt;/summary&gt;</span>
      <span style="color: rgba(0, 0, 255, 1)">public</span> (<span style="color: rgba(0, 0, 255, 1)">string</span>,<span style="color: rgba(0, 0, 255, 1)">string</span>)[] QueueAndRoutingKey { <span style="color: rgba(0, 0, 255, 1)">get</span>; <span style="color: rgba(0, 0, 255, 1)">set</span><span style="color: rgba(0, 0, 0, 1)">; }
      </span><span style="color: rgba(128, 128, 128, 1)">///</span> <span style="color: rgba(128, 128, 128, 1)">&lt;summary&gt;</span>
      <span style="color: rgba(128, 128, 128, 1)">///</span><span style="color: rgba(0, 128, 0, 1)"> 参数
      </span><span style="color: rgba(128, 128, 128, 1)">///</span> <span style="color: rgba(128, 128, 128, 1)">&lt;/summary&gt;</span>
      <span style="color: rgba(0, 0, 255, 1)">public</span> IDictionary&lt;<span style="color: rgba(0, 0, 255, 1)">string</span>, <span style="color: rgba(0, 0, 255, 1)">object</span>&gt; BindArguments { <span style="color: rgba(0, 0, 255, 1)">get</span>; <span style="color: rgba(0, 0, 255, 1)">set</span>; } = <span style="color: rgba(0, 0, 255, 1)">new</span> Dictionary&lt;<span style="color: rgba(0, 0, 255, 1)">string</span>, <span style="color: rgba(0, 0, 255, 1)">object</span>&gt;<span style="color: rgba(0, 0, 0, 1)">();
    }
}</span></pre>
</div>
<span class="cnblogs_code_collapse">QueueOptions</span></div>
<div class="cnblogs_code">  <img src="https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif" alt="" id="code_img_closed_b4fda8d9-28dd-41cd-aebc-490b36244021" class="code_img_closed"><img src="https://images.cnblogs.com/OutliningIndicators/ExpandedBlockStart.gif" alt="" id="code_img_opened_b4fda8d9-28dd-41cd-aebc-490b36244021" class="code_img_opened" style="display: none">
<div id="cnblogs_code_open_b4fda8d9-28dd-41cd-aebc-490b36244021" class="cnblogs_code_hide">
<pre><span style="color: rgba(0, 0, 255, 1)">using</span><span style="color: rgba(0, 0, 0, 1)"> System;
</span><span style="color: rgba(0, 0, 255, 1)">using</span><span style="color: rgba(0, 0, 0, 1)"> System.Collections.Generic;
</span><span style="color: rgba(0, 0, 255, 1)">using</span><span style="color: rgba(0, 0, 0, 1)"> System.Text;

</span><span style="color: rgba(0, 0, 255, 1)">namespace</span><span style="color: rgba(0, 0, 0, 1)"> RabbitMQ.ConsoleApp
{
    </span><span style="color: rgba(0, 0, 255, 1)">public</span> <span style="color: rgba(0, 0, 255, 1)">static</span> <span style="color: rgba(0, 0, 255, 1)">class</span><span style="color: rgba(0, 0, 0, 1)"> RabbitMQExchangeType
    {
      </span><span style="color: rgba(128, 128, 128, 1)">///</span> <span style="color: rgba(128, 128, 128, 1)">&lt;summary&gt;</span>
      <span style="color: rgba(128, 128, 128, 1)">///</span><span style="color: rgba(0, 128, 0, 1)"> 普通模式
      </span><span style="color: rgba(128, 128, 128, 1)">///</span> <span style="color: rgba(128, 128, 128, 1)">&lt;/summary&gt;</span>
      <span style="color: rgba(0, 0, 255, 1)">public</span> <span style="color: rgba(0, 0, 255, 1)">const</span> <span style="color: rgba(0, 0, 255, 1)">string</span> Common = <span style="color: rgba(128, 0, 0, 1)">""</span><span style="color: rgba(0, 0, 0, 1)">;
      </span><span style="color: rgba(128, 128, 128, 1)">///</span> <span style="color: rgba(128, 128, 128, 1)">&lt;summary&gt;</span>
      <span style="color: rgba(128, 128, 128, 1)">///</span><span style="color: rgba(0, 128, 0, 1)"> 路由模式
      </span><span style="color: rgba(128, 128, 128, 1)">///</span> <span style="color: rgba(128, 128, 128, 1)">&lt;/summary&gt;</span>
      <span style="color: rgba(0, 0, 255, 1)">public</span> <span style="color: rgba(0, 0, 255, 1)">const</span> <span style="color: rgba(0, 0, 255, 1)">string</span> Direct = <span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">direct</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">;
      </span><span style="color: rgba(128, 128, 128, 1)">///</span> <span style="color: rgba(128, 128, 128, 1)">&lt;summary&gt;</span>
      <span style="color: rgba(128, 128, 128, 1)">///</span><span style="color: rgba(0, 128, 0, 1)"> 发布/订阅模式
      </span><span style="color: rgba(128, 128, 128, 1)">///</span> <span style="color: rgba(128, 128, 128, 1)">&lt;/summary&gt;</span>
      <span style="color: rgba(0, 0, 255, 1)">public</span> <span style="color: rgba(0, 0, 255, 1)">const</span> <span style="color: rgba(0, 0, 255, 1)">string</span> Fanout = <span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">fanout</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">;
      </span><span style="color: rgba(128, 128, 128, 1)">///</span> <span style="color: rgba(128, 128, 128, 1)">&lt;summary&gt;</span>
      <span style="color: rgba(128, 128, 128, 1)">///</span><span style="color: rgba(0, 128, 0, 1)"> 匹配订阅模式
      </span><span style="color: rgba(128, 128, 128, 1)">///</span> <span style="color: rgba(128, 128, 128, 1)">&lt;/summary&gt;</span>
      <span style="color: rgba(0, 0, 255, 1)">public</span> <span style="color: rgba(0, 0, 255, 1)">const</span> <span style="color: rgba(0, 0, 255, 1)">string</span> Topic = <span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">topic</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">;
    }
}</span></pre>
</div>
<span class="cnblogs_code_collapse">RabbitMQExchangeType</span></div>
<div class="cnblogs_code">  <img src="https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif" alt="" id="code_img_closed_2e8a6b67-1d49-4460-a885-e40b1f8fd90f" class="code_img_closed"><img src="https://images.cnblogs.com/OutliningIndicators/ExpandedBlockStart.gif" alt="" id="code_img_opened_2e8a6b67-1d49-4460-a885-e40b1f8fd90f" class="code_img_opened" style="display: none">
<div id="cnblogs_code_open_2e8a6b67-1d49-4460-a885-e40b1f8fd90f" class="cnblogs_code_hide">
<pre><span style="color: rgba(0, 0, 255, 1)">using</span><span style="color: rgba(0, 0, 0, 1)"> RabbitMQ.Client;
</span><span style="color: rgba(0, 0, 255, 1)">using</span><span style="color: rgba(0, 0, 0, 1)"> System;
</span><span style="color: rgba(0, 0, 255, 1)">using</span><span style="color: rgba(0, 0, 0, 1)"> System.Collections.Generic;
</span><span style="color: rgba(0, 0, 255, 1)">using</span><span style="color: rgba(0, 0, 0, 1)"> System.Linq;
</span><span style="color: rgba(0, 0, 255, 1)">using</span><span style="color: rgba(0, 0, 0, 1)"> System.Text;

</span><span style="color: rgba(0, 0, 255, 1)">namespace</span><span style="color: rgba(0, 0, 0, 1)"> RabbitMQ.ConsoleApp
{
    </span><span style="color: rgba(0, 0, 255, 1)">public</span> <span style="color: rgba(0, 0, 255, 1)">abstract</span> <span style="color: rgba(0, 0, 255, 1)">class</span><span style="color: rgba(0, 0, 0, 1)"> RabbitBase : IDisposable
    {
      List</span>&lt;AmqpTcpEndpoint&gt;<span style="color: rgba(0, 0, 0, 1)"> amqpList;
      IConnection connection;

      </span><span style="color: rgba(0, 0, 255, 1)">protected</span> RabbitBase(<span style="color: rgba(0, 0, 255, 1)">params</span> <span style="color: rgba(0, 0, 255, 1)">string</span><span style="color: rgba(0, 0, 0, 1)">[] hosts)
      {
            </span><span style="color: rgba(0, 0, 255, 1)">if</span> (hosts == <span style="color: rgba(0, 0, 255, 1)">null</span> || hosts.Length == <span style="color: rgba(128, 0, 128, 1)">0</span><span style="color: rgba(0, 0, 0, 1)">)
            {
                </span><span style="color: rgba(0, 0, 255, 1)">throw</span> <span style="color: rgba(0, 0, 255, 1)">new</span> ArgumentException(<span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">invalid hosts!</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">, nameof(hosts));
            }

            </span><span style="color: rgba(0, 0, 255, 1)">this</span>.amqpList = <span style="color: rgba(0, 0, 255, 1)">new</span> List&lt;AmqpTcpEndpoint&gt;<span style="color: rgba(0, 0, 0, 1)">();
            </span><span style="color: rgba(0, 0, 255, 1)">this</span>.amqpList.AddRange(hosts.Select(host =&gt; <span style="color: rgba(0, 0, 255, 1)">new</span><span style="color: rgba(0, 0, 0, 1)"> AmqpTcpEndpoint(host, Port)));
      }
      </span><span style="color: rgba(0, 0, 255, 1)">protected</span> RabbitBase(<span style="color: rgba(0, 0, 255, 1)">params</span> (<span style="color: rgba(0, 0, 255, 1)">string</span>, <span style="color: rgba(0, 0, 255, 1)">int</span><span style="color: rgba(0, 0, 0, 1)">)[] hostAndPorts)
      {
            </span><span style="color: rgba(0, 0, 255, 1)">if</span> (hostAndPorts == <span style="color: rgba(0, 0, 255, 1)">null</span> || hostAndPorts.Length == <span style="color: rgba(128, 0, 128, 1)">0</span><span style="color: rgba(0, 0, 0, 1)">)
            {
                </span><span style="color: rgba(0, 0, 255, 1)">throw</span> <span style="color: rgba(0, 0, 255, 1)">new</span> ArgumentException(<span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">invalid hosts!</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">, nameof(hostAndPorts));
            }

            </span><span style="color: rgba(0, 0, 255, 1)">this</span>.amqpList = <span style="color: rgba(0, 0, 255, 1)">new</span> List&lt;AmqpTcpEndpoint&gt;<span style="color: rgba(0, 0, 0, 1)">();
            </span><span style="color: rgba(0, 0, 255, 1)">this</span>.amqpList.AddRange(hostAndPorts.Select(tuple =&gt; <span style="color: rgba(0, 0, 255, 1)">new</span><span style="color: rgba(0, 0, 0, 1)"> AmqpTcpEndpoint(tuple.Item1, tuple.Item2)));
      }

      </span><span style="color: rgba(128, 128, 128, 1)">///</span> <span style="color: rgba(128, 128, 128, 1)">&lt;summary&gt;</span>
      <span style="color: rgba(128, 128, 128, 1)">///</span><span style="color: rgba(0, 128, 0, 1)"> 端口
      </span><span style="color: rgba(128, 128, 128, 1)">///</span> <span style="color: rgba(128, 128, 128, 1)">&lt;/summary&gt;</span>
      <span style="color: rgba(0, 0, 255, 1)">public</span> <span style="color: rgba(0, 0, 255, 1)">int</span> Port { <span style="color: rgba(0, 0, 255, 1)">get</span>; <span style="color: rgba(0, 0, 255, 1)">set</span>; } = <span style="color: rgba(128, 0, 128, 1)">5672</span><span style="color: rgba(0, 0, 0, 1)">;
      </span><span style="color: rgba(128, 128, 128, 1)">///</span> <span style="color: rgba(128, 128, 128, 1)">&lt;summary&gt;</span>
      <span style="color: rgba(128, 128, 128, 1)">///</span><span style="color: rgba(0, 128, 0, 1)"> 账号
      </span><span style="color: rgba(128, 128, 128, 1)">///</span> <span style="color: rgba(128, 128, 128, 1)">&lt;/summary&gt;</span>
      <span style="color: rgba(0, 0, 255, 1)">public</span> <span style="color: rgba(0, 0, 255, 1)">string</span> UserName { <span style="color: rgba(0, 0, 255, 1)">get</span>; <span style="color: rgba(0, 0, 255, 1)">set</span>; } =<span style="color: rgba(0, 0, 0, 1)"> ConnectionFactory.DefaultUser;
      </span><span style="color: rgba(128, 128, 128, 1)">///</span> <span style="color: rgba(128, 128, 128, 1)">&lt;summary&gt;</span>
      <span style="color: rgba(128, 128, 128, 1)">///</span><span style="color: rgba(0, 128, 0, 1)"> 密码
      </span><span style="color: rgba(128, 128, 128, 1)">///</span> <span style="color: rgba(128, 128, 128, 1)">&lt;/summary&gt;</span>
      <span style="color: rgba(0, 0, 255, 1)">public</span> <span style="color: rgba(0, 0, 255, 1)">string</span> Password { <span style="color: rgba(0, 0, 255, 1)">get</span>; <span style="color: rgba(0, 0, 255, 1)">set</span>; } =<span style="color: rgba(0, 0, 0, 1)"> ConnectionFactory.DefaultPass;
      </span><span style="color: rgba(128, 128, 128, 1)">///</span> <span style="color: rgba(128, 128, 128, 1)">&lt;summary&gt;</span>
      <span style="color: rgba(128, 128, 128, 1)">///</span><span style="color: rgba(0, 128, 0, 1)"> 虚拟机
      </span><span style="color: rgba(128, 128, 128, 1)">///</span> <span style="color: rgba(128, 128, 128, 1)">&lt;/summary&gt;</span>
      <span style="color: rgba(0, 0, 255, 1)">public</span> <span style="color: rgba(0, 0, 255, 1)">string</span> VirtualHost { <span style="color: rgba(0, 0, 255, 1)">get</span>; <span style="color: rgba(0, 0, 255, 1)">set</span>; } =<span style="color: rgba(0, 0, 0, 1)"> ConnectionFactory.DefaultVHost;

      </span><span style="color: rgba(128, 128, 128, 1)">///</span> <span style="color: rgba(128, 128, 128, 1)">&lt;summary&gt;</span>
      <span style="color: rgba(128, 128, 128, 1)">///</span><span style="color: rgba(0, 128, 0, 1)"> 释放
      </span><span style="color: rgba(128, 128, 128, 1)">///</span> <span style="color: rgba(128, 128, 128, 1)">&lt;/summary&gt;</span>
      <span style="color: rgba(0, 0, 255, 1)">public</span> <span style="color: rgba(0, 0, 255, 1)">virtual</span> <span style="color: rgba(0, 0, 255, 1)">void</span><span style="color: rgba(0, 0, 0, 1)"> Dispose()
      {
            </span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">connection?.Close();
            </span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">connection?.Dispose();</span>
<span style="color: rgba(0, 0, 0, 1)">      }
      </span><span style="color: rgba(128, 128, 128, 1)">///</span> <span style="color: rgba(128, 128, 128, 1)">&lt;summary&gt;</span>
      <span style="color: rgba(128, 128, 128, 1)">///</span><span style="color: rgba(0, 128, 0, 1)"> 关闭连接
      </span><span style="color: rgba(128, 128, 128, 1)">///</span> <span style="color: rgba(128, 128, 128, 1)">&lt;/summary&gt;</span>
      <span style="color: rgba(0, 0, 255, 1)">public</span> <span style="color: rgba(0, 0, 255, 1)">void</span><span style="color: rgba(0, 0, 0, 1)"> Close()
      {
            connection</span>?<span style="color: rgba(0, 0, 0, 1)">.Close();
            connection</span>?<span style="color: rgba(0, 0, 0, 1)">.Dispose();
      }

      </span><span style="color: rgba(0, 0, 255, 1)">#region</span> Private
      <span style="color: rgba(128, 128, 128, 1)">///</span> <span style="color: rgba(128, 128, 128, 1)">&lt;summary&gt;</span>
      <span style="color: rgba(128, 128, 128, 1)">///</span><span style="color: rgba(0, 128, 0, 1)"> 获取rabbitmq的连接
      </span><span style="color: rgba(128, 128, 128, 1)">///</span> <span style="color: rgba(128, 128, 128, 1)">&lt;/summary&gt;</span>
      <span style="color: rgba(128, 128, 128, 1)">///</span> <span style="color: rgba(128, 128, 128, 1)">&lt;returns&gt;&lt;/returns&gt;</span>
      <span style="color: rgba(0, 0, 255, 1)">protected</span><span style="color: rgba(0, 0, 0, 1)"> IModel GetChannel()
      {
            </span><span style="color: rgba(0, 0, 255, 1)">if</span> (connection == <span style="color: rgba(0, 0, 255, 1)">null</span><span style="color: rgba(0, 0, 0, 1)">)
            {
                </span><span style="color: rgba(0, 0, 255, 1)">lock</span> (<span style="color: rgba(0, 0, 255, 1)">this</span><span style="color: rgba(0, 0, 0, 1)">)
                {
                  </span><span style="color: rgba(0, 0, 255, 1)">if</span> (connection == <span style="color: rgba(0, 0, 255, 1)">null</span><span style="color: rgba(0, 0, 0, 1)">)
                  {
                        </span><span style="color: rgba(0, 0, 255, 1)">var</span> factory = <span style="color: rgba(0, 0, 255, 1)">new</span><span style="color: rgba(0, 0, 0, 1)"> ConnectionFactory();
                        factory.Port </span>=<span style="color: rgba(0, 0, 0, 1)"> Port;
                        factory.UserName </span>=<span style="color: rgba(0, 0, 0, 1)"> UserName;
                        factory.VirtualHost </span>=<span style="color: rgba(0, 0, 0, 1)"> VirtualHost;
                        factory.Password </span>=<span style="color: rgba(0, 0, 0, 1)"> Password;
                        connection </span>= factory.CreateConnection(<span style="color: rgba(0, 0, 255, 1)">this</span><span style="color: rgba(0, 0, 0, 1)">.amqpList);
                  }
                }
            }
            </span><span style="color: rgba(0, 0, 255, 1)">return</span><span style="color: rgba(0, 0, 0, 1)"> connection.CreateModel();
      }

      </span><span style="color: rgba(0, 0, 255, 1)">#endregion</span><span style="color: rgba(0, 0, 0, 1)">
    }
}</span></pre>
</div>
<span class="cnblogs_code_collapse">RabbitBase</span></div>
<div class="cnblogs_code">  <img src="https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif" alt="" id="code_img_closed_b680f85b-fb8b-4151-b07f-1f12f591b4cc" class="code_img_closed"><img src="https://images.cnblogs.com/OutliningIndicators/ExpandedBlockStart.gif" alt="" id="code_img_opened_b680f85b-fb8b-4151-b07f-1f12f591b4cc" class="code_img_opened" style="display: none">
<div id="cnblogs_code_open_b680f85b-fb8b-4151-b07f-1f12f591b4cc" class="cnblogs_code_hide">
<pre><span style="color: rgba(0, 0, 255, 1)">using</span><span style="color: rgba(0, 0, 0, 1)"> RabbitMQ.Client;
</span><span style="color: rgba(0, 0, 255, 1)">using</span><span style="color: rgba(0, 0, 0, 1)"> System;
</span><span style="color: rgba(0, 0, 255, 1)">using</span><span style="color: rgba(0, 0, 0, 1)"> System.Collections.Generic;
</span><span style="color: rgba(0, 0, 255, 1)">using</span><span style="color: rgba(0, 0, 0, 1)"> System.Linq;
</span><span style="color: rgba(0, 0, 255, 1)">using</span><span style="color: rgba(0, 0, 0, 1)"> System.Text;

</span><span style="color: rgba(0, 0, 255, 1)">namespace</span><span style="color: rgba(0, 0, 0, 1)"> RabbitMQ.ConsoleApp
{
    </span><span style="color: rgba(0, 0, 255, 1)">public</span> <span style="color: rgba(0, 0, 255, 1)">class</span><span style="color: rgba(0, 0, 0, 1)"> RabbitMQProducer : RabbitBase
    {
      </span><span style="color: rgba(0, 0, 255, 1)">public</span> RabbitMQProducer(<span style="color: rgba(0, 0, 255, 1)">params</span> <span style="color: rgba(0, 0, 255, 1)">string</span>[] hosts) : <span style="color: rgba(0, 0, 255, 1)">base</span><span style="color: rgba(0, 0, 0, 1)">(hosts)
      {

      }
      </span><span style="color: rgba(0, 0, 255, 1)">public</span> RabbitMQProducer(<span style="color: rgba(0, 0, 255, 1)">params</span> (<span style="color: rgba(0, 0, 255, 1)">string</span>,<span style="color: rgba(0, 0, 255, 1)">int</span>)[] hostAndPorts) : <span style="color: rgba(0, 0, 255, 1)">base</span><span style="color: rgba(0, 0, 0, 1)">(hostAndPorts)
      {

      }

      </span><span style="color: rgba(0, 0, 255, 1)">#region</span> 普通模式、Work模式
      <span style="color: rgba(128, 128, 128, 1)">///</span> <span style="color: rgba(128, 128, 128, 1)">&lt;summary&gt;</span>
      <span style="color: rgba(128, 128, 128, 1)">///</span><span style="color: rgba(0, 128, 0, 1)"> 发布消息
      </span><span style="color: rgba(128, 128, 128, 1)">///</span> <span style="color: rgba(128, 128, 128, 1)">&lt;/summary&gt;</span>
      <span style="color: rgba(128, 128, 128, 1)">///</span> <span style="color: rgba(128, 128, 128, 1)">&lt;param name="queue"&gt;&lt;/param&gt;</span>
      <span style="color: rgba(128, 128, 128, 1)">///</span> <span style="color: rgba(128, 128, 128, 1)">&lt;param name="message"&gt;&lt;/param&gt;</span>
      <span style="color: rgba(128, 128, 128, 1)">///</span> <span style="color: rgba(128, 128, 128, 1)">&lt;param name="options"&gt;&lt;/param&gt;</span>
      <span style="color: rgba(0, 0, 255, 1)">public</span> <span style="color: rgba(0, 0, 255, 1)">void</span> Publish(<span style="color: rgba(0, 0, 255, 1)">string</span> queue, <span style="color: rgba(0, 0, 255, 1)">string</span> message, QueueOptions options = <span style="color: rgba(0, 0, 255, 1)">null</span><span style="color: rgba(0, 0, 0, 1)">)
      {
            options </span>= options ?? <span style="color: rgba(0, 0, 255, 1)">new</span><span style="color: rgba(0, 0, 0, 1)"> QueueOptions();
            </span><span style="color: rgba(0, 0, 255, 1)">var</span> channel =<span style="color: rgba(0, 0, 0, 1)"> GetChannel();
            channel.QueueDeclare(queue, options.Durable, </span><span style="color: rgba(0, 0, 255, 1)">false</span>, options.AutoDelete, options.Arguments ?? <span style="color: rgba(0, 0, 255, 1)">new</span> Dictionary&lt;<span style="color: rgba(0, 0, 255, 1)">string</span>, <span style="color: rgba(0, 0, 255, 1)">object</span>&gt;<span style="color: rgba(0, 0, 0, 1)">());
            </span><span style="color: rgba(0, 0, 255, 1)">var</span> buffer =<span style="color: rgba(0, 0, 0, 1)"> Encoding.UTF8.GetBytes(message);
            channel.BasicPublish(</span><span style="color: rgba(128, 0, 0, 1)">""</span>, queue, <span style="color: rgba(0, 0, 255, 1)">null</span><span style="color: rgba(0, 0, 0, 1)">, buffer);
            channel.Close();
      }
      </span><span style="color: rgba(128, 128, 128, 1)">///</span> <span style="color: rgba(128, 128, 128, 1)">&lt;summary&gt;</span>
      <span style="color: rgba(128, 128, 128, 1)">///</span><span style="color: rgba(0, 128, 0, 1)"> 发布消息
      </span><span style="color: rgba(128, 128, 128, 1)">///</span> <span style="color: rgba(128, 128, 128, 1)">&lt;/summary&gt;</span>
      <span style="color: rgba(128, 128, 128, 1)">///</span> <span style="color: rgba(128, 128, 128, 1)">&lt;param name="queue"&gt;&lt;/param&gt;</span>
      <span style="color: rgba(128, 128, 128, 1)">///</span> <span style="color: rgba(128, 128, 128, 1)">&lt;param name="message"&gt;&lt;/param&gt;</span>
      <span style="color: rgba(128, 128, 128, 1)">///</span> <span style="color: rgba(128, 128, 128, 1)">&lt;param name="configure"&gt;&lt;/param&gt;</span>
      <span style="color: rgba(0, 0, 255, 1)">public</span> <span style="color: rgba(0, 0, 255, 1)">void</span> Publish(<span style="color: rgba(0, 0, 255, 1)">string</span> queue, <span style="color: rgba(0, 0, 255, 1)">string</span> message, Action&lt;QueueOptions&gt;<span style="color: rgba(0, 0, 0, 1)"> configure)
      {
            QueueOptions options </span>= <span style="color: rgba(0, 0, 255, 1)">new</span><span style="color: rgba(0, 0, 0, 1)"> QueueOptions();
            configure</span>?<span style="color: rgba(0, 0, 0, 1)">.Invoke(options);
            Publish(queue, message, options);
      }
      </span><span style="color: rgba(0, 0, 255, 1)">#endregion</span>
      <span style="color: rgba(0, 0, 255, 1)">#region</span> 订阅模式、路由模式、Topic模式
      <span style="color: rgba(128, 128, 128, 1)">///</span> <span style="color: rgba(128, 128, 128, 1)">&lt;summary&gt;</span>
      <span style="color: rgba(128, 128, 128, 1)">///</span><span style="color: rgba(0, 128, 0, 1)"> 发布消息
      </span><span style="color: rgba(128, 128, 128, 1)">///</span> <span style="color: rgba(128, 128, 128, 1)">&lt;/summary&gt;</span>
      <span style="color: rgba(128, 128, 128, 1)">///</span> <span style="color: rgba(128, 128, 128, 1)">&lt;param name="exchange"&gt;&lt;/param&gt;</span>
      <span style="color: rgba(128, 128, 128, 1)">///</span> <span style="color: rgba(128, 128, 128, 1)">&lt;param name="routingKey"&gt;&lt;/param&gt;</span>
      <span style="color: rgba(128, 128, 128, 1)">///</span> <span style="color: rgba(128, 128, 128, 1)">&lt;param name="message"&gt;&lt;/param&gt;</span>
      <span style="color: rgba(128, 128, 128, 1)">///</span> <span style="color: rgba(128, 128, 128, 1)">&lt;param name="options"&gt;&lt;/param&gt;</span>
      <span style="color: rgba(0, 0, 255, 1)">public</span> <span style="color: rgba(0, 0, 255, 1)">void</span> Publish(<span style="color: rgba(0, 0, 255, 1)">string</span> exchange, <span style="color: rgba(0, 0, 255, 1)">string</span> routingKey, <span style="color: rgba(0, 0, 255, 1)">string</span> message, ExchangeQueueOptions options = <span style="color: rgba(0, 0, 255, 1)">null</span><span style="color: rgba(0, 0, 0, 1)">)
      {
            options </span>= options ?? <span style="color: rgba(0, 0, 255, 1)">new</span><span style="color: rgba(0, 0, 0, 1)"> ExchangeQueueOptions();
            </span><span style="color: rgba(0, 0, 255, 1)">var</span> channel =<span style="color: rgba(0, 0, 0, 1)"> GetChannel();
            channel.ExchangeDeclare(exchange, </span><span style="color: rgba(0, 0, 255, 1)">string</span>.IsNullOrEmpty(options.Type) ? RabbitMQExchangeType.Fanout : options.Type, options.Durable, options.AutoDelete, options.Arguments ?? <span style="color: rgba(0, 0, 255, 1)">new</span> Dictionary&lt;<span style="color: rgba(0, 0, 255, 1)">string</span>, <span style="color: rgba(0, 0, 255, 1)">object</span>&gt;<span style="color: rgba(0, 0, 0, 1)">());
            </span><span style="color: rgba(0, 0, 255, 1)">if</span> (options.QueueAndRoutingKey != <span style="color: rgba(0, 0, 255, 1)">null</span><span style="color: rgba(0, 0, 0, 1)">)
            {
                </span><span style="color: rgba(0, 0, 255, 1)">foreach</span> (<span style="color: rgba(0, 0, 255, 1)">var</span> t <span style="color: rgba(0, 0, 255, 1)">in</span><span style="color: rgba(0, 0, 0, 1)"> options.QueueAndRoutingKey)
                {
                  </span><span style="color: rgba(0, 0, 255, 1)">if</span> (!<span style="color: rgba(0, 0, 255, 1)">string</span><span style="color: rgba(0, 0, 0, 1)">.IsNullOrEmpty(t.Item1))
                  {
                        channel.QueueBind(t.Item1, exchange, t.Item2 </span>?? <span style="color: rgba(128, 0, 0, 1)">""</span>, options.BindArguments ?? <span style="color: rgba(0, 0, 255, 1)">new</span> Dictionary&lt;<span style="color: rgba(0, 0, 255, 1)">string</span>, <span style="color: rgba(0, 0, 255, 1)">object</span>&gt;<span style="color: rgba(0, 0, 0, 1)">());
                  }
                }
            }
            </span><span style="color: rgba(0, 0, 255, 1)">var</span> buffer =<span style="color: rgba(0, 0, 0, 1)"> Encoding.UTF8.GetBytes(message);
            channel.BasicPublish(exchange, routingKey, </span><span style="color: rgba(0, 0, 255, 1)">null</span><span style="color: rgba(0, 0, 0, 1)">, buffer);
            channel.Close();
      }
      </span><span style="color: rgba(128, 128, 128, 1)">///</span> <span style="color: rgba(128, 128, 128, 1)">&lt;summary&gt;</span>
      <span style="color: rgba(128, 128, 128, 1)">///</span><span style="color: rgba(0, 128, 0, 1)"> 发布消息
      </span><span style="color: rgba(128, 128, 128, 1)">///</span> <span style="color: rgba(128, 128, 128, 1)">&lt;/summary&gt;</span>
      <span style="color: rgba(128, 128, 128, 1)">///</span> <span style="color: rgba(128, 128, 128, 1)">&lt;param name="exchange"&gt;&lt;/param&gt;</span>
      <span style="color: rgba(128, 128, 128, 1)">///</span> <span style="color: rgba(128, 128, 128, 1)">&lt;param name="routingKey"&gt;&lt;/param&gt;</span>
      <span style="color: rgba(128, 128, 128, 1)">///</span> <span style="color: rgba(128, 128, 128, 1)">&lt;param name="message"&gt;&lt;/param&gt;</span>
      <span style="color: rgba(128, 128, 128, 1)">///</span> <span style="color: rgba(128, 128, 128, 1)">&lt;param name="configure"&gt;&lt;/param&gt;</span>
      <span style="color: rgba(0, 0, 255, 1)">public</span> <span style="color: rgba(0, 0, 255, 1)">void</span> Publish(<span style="color: rgba(0, 0, 255, 1)">string</span> exchange, <span style="color: rgba(0, 0, 255, 1)">string</span> routingKey, <span style="color: rgba(0, 0, 255, 1)">string</span> message, Action&lt;ExchangeQueueOptions&gt;<span style="color: rgba(0, 0, 0, 1)"> configure)
      {
            ExchangeQueueOptions options </span>= <span style="color: rgba(0, 0, 255, 1)">new</span><span style="color: rgba(0, 0, 0, 1)"> ExchangeQueueOptions();
            configure</span>?<span style="color: rgba(0, 0, 0, 1)">.Invoke(options);
            Publish(exchange, routingKey, message, options);
      }
      </span><span style="color: rgba(0, 0, 255, 1)">#endregion</span><span style="color: rgba(0, 0, 0, 1)">
    }
}</span></pre>
</div>
<span class="cnblogs_code_collapse">RabbitMQProducer</span></div>
<div class="cnblogs_code">  <img src="https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif" alt="" id="code_img_closed_0a73ef52-5fc5-4317-b993-f513ae98c3ac" class="code_img_closed"><img src="https://images.cnblogs.com/OutliningIndicators/ExpandedBlockStart.gif" alt="" id="code_img_opened_0a73ef52-5fc5-4317-b993-f513ae98c3ac" class="code_img_opened" style="display: none">
<div id="cnblogs_code_open_0a73ef52-5fc5-4317-b993-f513ae98c3ac" class="cnblogs_code_hide">
<pre><span style="color: rgba(0, 0, 255, 1)">using</span><span style="color: rgba(0, 0, 0, 1)"> RabbitMQ.Client;
</span><span style="color: rgba(0, 0, 255, 1)">using</span><span style="color: rgba(0, 0, 0, 1)"> RabbitMQ.Client.Events;
</span><span style="color: rgba(0, 0, 255, 1)">using</span><span style="color: rgba(0, 0, 0, 1)"> System;
</span><span style="color: rgba(0, 0, 255, 1)">using</span><span style="color: rgba(0, 0, 0, 1)"> System.Collections.Generic;
</span><span style="color: rgba(0, 0, 255, 1)">using</span><span style="color: rgba(0, 0, 0, 1)"> System.Text;
</span><span style="color: rgba(0, 0, 255, 1)">using</span><span style="color: rgba(0, 0, 0, 1)"> System.Threading;

</span><span style="color: rgba(0, 0, 255, 1)">namespace</span><span style="color: rgba(0, 0, 0, 1)"> RabbitMQ.ConsoleApp
{
    </span><span style="color: rgba(0, 0, 255, 1)">public</span> <span style="color: rgba(0, 0, 255, 1)">class</span><span style="color: rgba(0, 0, 0, 1)"> RabbitMQConsumer : RabbitBase
    {
      </span><span style="color: rgba(0, 0, 255, 1)">public</span> RabbitMQConsumer(<span style="color: rgba(0, 0, 255, 1)">params</span> <span style="color: rgba(0, 0, 255, 1)">string</span>[] hosts) : <span style="color: rgba(0, 0, 255, 1)">base</span><span style="color: rgba(0, 0, 0, 1)">(hosts)
      {

      }
      </span><span style="color: rgba(0, 0, 255, 1)">public</span> RabbitMQConsumer(<span style="color: rgba(0, 0, 255, 1)">params</span> (<span style="color: rgba(0, 0, 255, 1)">string</span>, <span style="color: rgba(0, 0, 255, 1)">int</span>)[] hostAndPorts) : <span style="color: rgba(0, 0, 255, 1)">base</span><span style="color: rgba(0, 0, 0, 1)">(hostAndPorts)
      {

      }

      </span><span style="color: rgba(0, 0, 255, 1)">public</span> <span style="color: rgba(0, 0, 255, 1)">event</span> Action&lt;RecieveResult&gt;<span style="color: rgba(0, 0, 0, 1)"> Received;

      </span><span style="color: rgba(128, 128, 128, 1)">///</span> <span style="color: rgba(128, 128, 128, 1)">&lt;summary&gt;</span>
      <span style="color: rgba(128, 128, 128, 1)">///</span><span style="color: rgba(0, 128, 0, 1)"> 构造消费者
      </span><span style="color: rgba(128, 128, 128, 1)">///</span> <span style="color: rgba(128, 128, 128, 1)">&lt;/summary&gt;</span>
      <span style="color: rgba(128, 128, 128, 1)">///</span> <span style="color: rgba(128, 128, 128, 1)">&lt;param name="channel"&gt;&lt;/param&gt;</span>
      <span style="color: rgba(128, 128, 128, 1)">///</span> <span style="color: rgba(128, 128, 128, 1)">&lt;param name="options"&gt;&lt;/param&gt;</span>
      <span style="color: rgba(128, 128, 128, 1)">///</span> <span style="color: rgba(128, 128, 128, 1)">&lt;returns&gt;&lt;/returns&gt;</span>
      <span style="color: rgba(0, 0, 255, 1)">private</span><span style="color: rgba(0, 0, 0, 1)"> IBasicConsumer ConsumeInternal(IModel channel, ConsumeQueueOptions options)
      {
            EventingBasicConsumer consumer </span>= <span style="color: rgba(0, 0, 255, 1)">new</span><span style="color: rgba(0, 0, 0, 1)"> EventingBasicConsumer(channel);
            consumer.Received </span>+= (sender, e) =&gt;<span style="color: rgba(0, 0, 0, 1)">
            {
                </span><span style="color: rgba(0, 0, 255, 1)">try</span><span style="color: rgba(0, 0, 0, 1)">
                {
                  CancellationTokenSource cancellationTokenSource </span>= <span style="color: rgba(0, 0, 255, 1)">new</span><span style="color: rgba(0, 0, 0, 1)"> CancellationTokenSource();
                  </span><span style="color: rgba(0, 0, 255, 1)">if</span> (!<span style="color: rgba(0, 0, 0, 1)">options.AutoAck)
                  {
                        cancellationTokenSource.Token.Register(() </span>=&gt;<span style="color: rgba(0, 0, 0, 1)">
                        {
                            channel.BasicAck(e.DeliveryTag, </span><span style="color: rgba(0, 0, 255, 1)">false</span><span style="color: rgba(0, 0, 0, 1)">);
                        });
                  }
                  Received</span>?.Invoke(<span style="color: rgba(0, 0, 255, 1)">new</span><span style="color: rgba(0, 0, 0, 1)"> RecieveResult(e, cancellationTokenSource));
                }
                </span><span style="color: rgba(0, 0, 255, 1)">catch</span><span style="color: rgba(0, 0, 0, 1)"> { }
            };
            </span><span style="color: rgba(0, 0, 255, 1)">if</span> (options.FetchCount != <span style="color: rgba(0, 0, 255, 1)">null</span><span style="color: rgba(0, 0, 0, 1)">)
            {
                channel.BasicQos(</span><span style="color: rgba(128, 0, 128, 1)">0</span>, options.FetchCount.Value, <span style="color: rgba(0, 0, 255, 1)">false</span><span style="color: rgba(0, 0, 0, 1)">);
            }
            </span><span style="color: rgba(0, 0, 255, 1)">return</span><span style="color: rgba(0, 0, 0, 1)"> consumer;
      }

      </span><span style="color: rgba(0, 0, 255, 1)">#region</span> 普通模式、Work模式
      <span style="color: rgba(128, 128, 128, 1)">///</span> <span style="color: rgba(128, 128, 128, 1)">&lt;summary&gt;</span>
      <span style="color: rgba(128, 128, 128, 1)">///</span><span style="color: rgba(0, 128, 0, 1)"> 消费消息
      </span><span style="color: rgba(128, 128, 128, 1)">///</span> <span style="color: rgba(128, 128, 128, 1)">&lt;/summary&gt;</span>
      <span style="color: rgba(128, 128, 128, 1)">///</span> <span style="color: rgba(128, 128, 128, 1)">&lt;param name="queue"&gt;&lt;/param&gt;</span>
      <span style="color: rgba(128, 128, 128, 1)">///</span> <span style="color: rgba(128, 128, 128, 1)">&lt;param name="options"&gt;&lt;/param&gt;</span>
      <span style="color: rgba(0, 0, 255, 1)">public</span> ListenResult Listen(<span style="color: rgba(0, 0, 255, 1)">string</span> queue, ConsumeQueueOptions options = <span style="color: rgba(0, 0, 255, 1)">null</span><span style="color: rgba(0, 0, 0, 1)">)
      {
            options </span>= options ?? <span style="color: rgba(0, 0, 255, 1)">new</span><span style="color: rgba(0, 0, 0, 1)"> ConsumeQueueOptions();
            </span><span style="color: rgba(0, 0, 255, 1)">var</span> channel =<span style="color: rgba(0, 0, 0, 1)"> GetChannel();
            channel.QueueDeclare(queue, options.Durable, </span><span style="color: rgba(0, 0, 255, 1)">false</span>, options.AutoDelete, options.Arguments ?? <span style="color: rgba(0, 0, 255, 1)">new</span> Dictionary&lt;<span style="color: rgba(0, 0, 255, 1)">string</span>, <span style="color: rgba(0, 0, 255, 1)">object</span>&gt;<span style="color: rgba(0, 0, 0, 1)">());
            </span><span style="color: rgba(0, 0, 255, 1)">var</span> consumer =<span style="color: rgba(0, 0, 0, 1)"> ConsumeInternal(channel, options);
            channel.BasicConsume(queue, options.AutoAck, consumer);
            ListenResult result </span>= <span style="color: rgba(0, 0, 255, 1)">new</span><span style="color: rgba(0, 0, 0, 1)"> ListenResult();
            result.Token.Register(() </span>=&gt;<span style="color: rgba(0, 0, 0, 1)">
            {
                </span><span style="color: rgba(0, 0, 255, 1)">try</span><span style="color: rgba(0, 0, 0, 1)">
                {
                  channel.Close();
                  channel.Dispose();
                }
                </span><span style="color: rgba(0, 0, 255, 1)">catch</span><span style="color: rgba(0, 0, 0, 1)"> { }
            });
            </span><span style="color: rgba(0, 0, 255, 1)">return</span><span style="color: rgba(0, 0, 0, 1)"> result;
      }
      </span><span style="color: rgba(128, 128, 128, 1)">///</span> <span style="color: rgba(128, 128, 128, 1)">&lt;summary&gt;</span>
      <span style="color: rgba(128, 128, 128, 1)">///</span><span style="color: rgba(0, 128, 0, 1)"> 消费消息
      </span><span style="color: rgba(128, 128, 128, 1)">///</span> <span style="color: rgba(128, 128, 128, 1)">&lt;/summary&gt;</span>
      <span style="color: rgba(128, 128, 128, 1)">///</span> <span style="color: rgba(128, 128, 128, 1)">&lt;param name="queue"&gt;&lt;/param&gt;</span>
      <span style="color: rgba(128, 128, 128, 1)">///</span> <span style="color: rgba(128, 128, 128, 1)">&lt;param name="configure"&gt;&lt;/param&gt;</span>
      <span style="color: rgba(0, 0, 255, 1)">public</span> ListenResult Listen(<span style="color: rgba(0, 0, 255, 1)">string</span> queue, Action&lt;ConsumeQueueOptions&gt;<span style="color: rgba(0, 0, 0, 1)"> configure)
      {
            ConsumeQueueOptions options </span>= <span style="color: rgba(0, 0, 255, 1)">new</span><span style="color: rgba(0, 0, 0, 1)"> ConsumeQueueOptions();
            configure</span>?<span style="color: rgba(0, 0, 0, 1)">.Invoke(options);
            </span><span style="color: rgba(0, 0, 255, 1)">return</span><span style="color: rgba(0, 0, 0, 1)"> Listen(queue, options);
      }
      </span><span style="color: rgba(0, 0, 255, 1)">#endregion</span>
      <span style="color: rgba(0, 0, 255, 1)">#region</span> 订阅模式、路由模式、Topic模式
      <span style="color: rgba(128, 128, 128, 1)">///</span> <span style="color: rgba(128, 128, 128, 1)">&lt;summary&gt;</span>
      <span style="color: rgba(128, 128, 128, 1)">///</span><span style="color: rgba(0, 128, 0, 1)"> 消费消息
      </span><span style="color: rgba(128, 128, 128, 1)">///</span> <span style="color: rgba(128, 128, 128, 1)">&lt;/summary&gt;</span>
      <span style="color: rgba(128, 128, 128, 1)">///</span> <span style="color: rgba(128, 128, 128, 1)">&lt;param name="exchange"&gt;&lt;/param&gt;</span>
      <span style="color: rgba(128, 128, 128, 1)">///</span> <span style="color: rgba(128, 128, 128, 1)">&lt;param name="queue"&gt;&lt;/param&gt;</span>
      <span style="color: rgba(128, 128, 128, 1)">///</span> <span style="color: rgba(128, 128, 128, 1)">&lt;param name="options"&gt;&lt;/param&gt;</span>
      <span style="color: rgba(0, 0, 255, 1)">public</span> ListenResult Listen(<span style="color: rgba(0, 0, 255, 1)">string</span> exchange, <span style="color: rgba(0, 0, 255, 1)">string</span> queue, ExchangeConsumeQueueOptions options = <span style="color: rgba(0, 0, 255, 1)">null</span><span style="color: rgba(0, 0, 0, 1)">)
      {
            options </span>= options ?? <span style="color: rgba(0, 0, 255, 1)">new</span><span style="color: rgba(0, 0, 0, 1)"> ExchangeConsumeQueueOptions();
            </span><span style="color: rgba(0, 0, 255, 1)">var</span> channel =<span style="color: rgba(0, 0, 0, 1)"> GetChannel();
            channel.QueueDeclare(queue, options.Durable, </span><span style="color: rgba(0, 0, 255, 1)">false</span>, options.AutoDelete, options.Arguments ?? <span style="color: rgba(0, 0, 255, 1)">new</span> Dictionary&lt;<span style="color: rgba(0, 0, 255, 1)">string</span>, <span style="color: rgba(0, 0, 255, 1)">object</span>&gt;<span style="color: rgba(0, 0, 0, 1)">());
            </span><span style="color: rgba(0, 0, 255, 1)">if</span> (options.RoutingKeys != <span style="color: rgba(0, 0, 255, 1)">null</span> &amp;&amp; !<span style="color: rgba(0, 0, 255, 1)">string</span><span style="color: rgba(0, 0, 0, 1)">.IsNullOrEmpty(exchange))
            {
                </span><span style="color: rgba(0, 0, 255, 1)">foreach</span> (<span style="color: rgba(0, 0, 255, 1)">var</span> key <span style="color: rgba(0, 0, 255, 1)">in</span><span style="color: rgba(0, 0, 0, 1)"> options.RoutingKeys)
                {
                  channel.QueueBind(queue, exchange, key, options.BindArguments);
                }
            }
            </span><span style="color: rgba(0, 0, 255, 1)">var</span> consumer =<span style="color: rgba(0, 0, 0, 1)"> ConsumeInternal(channel, options);
            channel.BasicConsume(queue, options.AutoAck, consumer);
            ListenResult result </span>= <span style="color: rgba(0, 0, 255, 1)">new</span><span style="color: rgba(0, 0, 0, 1)"> ListenResult();
            result.Token.Register(() </span>=&gt;<span style="color: rgba(0, 0, 0, 1)">
            {
                </span><span style="color: rgba(0, 0, 255, 1)">try</span><span style="color: rgba(0, 0, 0, 1)">
                {
                  channel.Close();
                  channel.Dispose();
                }
                </span><span style="color: rgba(0, 0, 255, 1)">catch</span><span style="color: rgba(0, 0, 0, 1)"> { }
            });
            </span><span style="color: rgba(0, 0, 255, 1)">return</span><span style="color: rgba(0, 0, 0, 1)"> result;
      }
      </span><span style="color: rgba(128, 128, 128, 1)">///</span> <span style="color: rgba(128, 128, 128, 1)">&lt;summary&gt;</span>
      <span style="color: rgba(128, 128, 128, 1)">///</span><span style="color: rgba(0, 128, 0, 1)"> 消费消息
      </span><span style="color: rgba(128, 128, 128, 1)">///</span> <span style="color: rgba(128, 128, 128, 1)">&lt;/summary&gt;</span>
      <span style="color: rgba(128, 128, 128, 1)">///</span> <span style="color: rgba(128, 128, 128, 1)">&lt;param name="exchange"&gt;&lt;/param&gt;</span>
      <span style="color: rgba(128, 128, 128, 1)">///</span> <span style="color: rgba(128, 128, 128, 1)">&lt;param name="queue"&gt;&lt;/param&gt;</span>
      <span style="color: rgba(128, 128, 128, 1)">///</span> <span style="color: rgba(128, 128, 128, 1)">&lt;param name="configure"&gt;&lt;/param&gt;</span>
      <span style="color: rgba(0, 0, 255, 1)">public</span> ListenResult Listen(<span style="color: rgba(0, 0, 255, 1)">string</span> exchange, <span style="color: rgba(0, 0, 255, 1)">string</span> queue, Action&lt;ExchangeConsumeQueueOptions&gt;<span style="color: rgba(0, 0, 0, 1)"> configure)
      {
            ExchangeConsumeQueueOptions options </span>= <span style="color: rgba(0, 0, 255, 1)">new</span><span style="color: rgba(0, 0, 0, 1)"> ExchangeConsumeQueueOptions();
            configure</span>?<span style="color: rgba(0, 0, 0, 1)">.Invoke(options);
            </span><span style="color: rgba(0, 0, 255, 1)">return</span><span style="color: rgba(0, 0, 0, 1)"> Listen(exchange, queue, options);
      }
      </span><span style="color: rgba(0, 0, 255, 1)">#endregion</span><span style="color: rgba(0, 0, 0, 1)">
    }
    </span><span style="color: rgba(0, 0, 255, 1)">public</span> <span style="color: rgba(0, 0, 255, 1)">class</span><span style="color: rgba(0, 0, 0, 1)"> RecieveResult
    {
      CancellationTokenSource cancellationTokenSource;
      </span><span style="color: rgba(0, 0, 255, 1)">public</span><span style="color: rgba(0, 0, 0, 1)"> RecieveResult(BasicDeliverEventArgs arg, CancellationTokenSource cancellationTokenSource)
      {
            </span><span style="color: rgba(0, 0, 255, 1)">this</span>.Body =<span style="color: rgba(0, 0, 0, 1)"> Encoding.UTF8.GetString(arg.Body);
            </span><span style="color: rgba(0, 0, 255, 1)">this</span>.ConsumerTag =<span style="color: rgba(0, 0, 0, 1)"> arg.ConsumerTag;
            </span><span style="color: rgba(0, 0, 255, 1)">this</span>.DeliveryTag =<span style="color: rgba(0, 0, 0, 1)"> arg.DeliveryTag;
            </span><span style="color: rgba(0, 0, 255, 1)">this</span>.Exchange =<span style="color: rgba(0, 0, 0, 1)"> arg.Exchange;
            </span><span style="color: rgba(0, 0, 255, 1)">this</span>.Redelivered =<span style="color: rgba(0, 0, 0, 1)"> arg.Redelivered;
            </span><span style="color: rgba(0, 0, 255, 1)">this</span>.RoutingKey =<span style="color: rgba(0, 0, 0, 1)"> arg.RoutingKey;
            </span><span style="color: rgba(0, 0, 255, 1)">this</span>.cancellationTokenSource =<span style="color: rgba(0, 0, 0, 1)"> cancellationTokenSource;
      }

      </span><span style="color: rgba(128, 128, 128, 1)">///</span> <span style="color: rgba(128, 128, 128, 1)">&lt;summary&gt;</span>
      <span style="color: rgba(128, 128, 128, 1)">///</span><span style="color: rgba(0, 128, 0, 1)"> 消息体
      </span><span style="color: rgba(128, 128, 128, 1)">///</span> <span style="color: rgba(128, 128, 128, 1)">&lt;/summary&gt;</span>
      <span style="color: rgba(0, 0, 255, 1)">public</span> <span style="color: rgba(0, 0, 255, 1)">string</span> Body { <span style="color: rgba(0, 0, 255, 1)">get</span>; <span style="color: rgba(0, 0, 255, 1)">private</span> <span style="color: rgba(0, 0, 255, 1)">set</span><span style="color: rgba(0, 0, 0, 1)">; }
      </span><span style="color: rgba(128, 128, 128, 1)">///</span> <span style="color: rgba(128, 128, 128, 1)">&lt;summary&gt;</span>
      <span style="color: rgba(128, 128, 128, 1)">///</span><span style="color: rgba(0, 128, 0, 1)"> 消费者标签
      </span><span style="color: rgba(128, 128, 128, 1)">///</span> <span style="color: rgba(128, 128, 128, 1)">&lt;/summary&gt;</span>
      <span style="color: rgba(0, 0, 255, 1)">public</span> <span style="color: rgba(0, 0, 255, 1)">string</span> ConsumerTag { <span style="color: rgba(0, 0, 255, 1)">get</span>; <span style="color: rgba(0, 0, 255, 1)">private</span> <span style="color: rgba(0, 0, 255, 1)">set</span><span style="color: rgba(0, 0, 0, 1)">; }
      </span><span style="color: rgba(128, 128, 128, 1)">///</span> <span style="color: rgba(128, 128, 128, 1)">&lt;summary&gt;</span>
      <span style="color: rgba(128, 128, 128, 1)">///</span><span style="color: rgba(0, 128, 0, 1)"> Ack标签
      </span><span style="color: rgba(128, 128, 128, 1)">///</span> <span style="color: rgba(128, 128, 128, 1)">&lt;/summary&gt;</span>
      <span style="color: rgba(0, 0, 255, 1)">public</span> <span style="color: rgba(0, 0, 255, 1)">ulong</span> DeliveryTag { <span style="color: rgba(0, 0, 255, 1)">get</span>; <span style="color: rgba(0, 0, 255, 1)">private</span> <span style="color: rgba(0, 0, 255, 1)">set</span><span style="color: rgba(0, 0, 0, 1)">; }
      </span><span style="color: rgba(128, 128, 128, 1)">///</span> <span style="color: rgba(128, 128, 128, 1)">&lt;summary&gt;</span>
      <span style="color: rgba(128, 128, 128, 1)">///</span><span style="color: rgba(0, 128, 0, 1)"> 交换机
      </span><span style="color: rgba(128, 128, 128, 1)">///</span> <span style="color: rgba(128, 128, 128, 1)">&lt;/summary&gt;</span>
      <span style="color: rgba(0, 0, 255, 1)">public</span> <span style="color: rgba(0, 0, 255, 1)">string</span> Exchange { <span style="color: rgba(0, 0, 255, 1)">get</span>; <span style="color: rgba(0, 0, 255, 1)">private</span> <span style="color: rgba(0, 0, 255, 1)">set</span><span style="color: rgba(0, 0, 0, 1)">; }
      </span><span style="color: rgba(128, 128, 128, 1)">///</span> <span style="color: rgba(128, 128, 128, 1)">&lt;summary&gt;</span>
      <span style="color: rgba(128, 128, 128, 1)">///</span><span style="color: rgba(0, 128, 0, 1)"> 是否Ack
      </span><span style="color: rgba(128, 128, 128, 1)">///</span> <span style="color: rgba(128, 128, 128, 1)">&lt;/summary&gt;</span>
      <span style="color: rgba(0, 0, 255, 1)">public</span> <span style="color: rgba(0, 0, 255, 1)">bool</span> Redelivered { <span style="color: rgba(0, 0, 255, 1)">get</span>; <span style="color: rgba(0, 0, 255, 1)">private</span> <span style="color: rgba(0, 0, 255, 1)">set</span><span style="color: rgba(0, 0, 0, 1)">; }
      </span><span style="color: rgba(128, 128, 128, 1)">///</span> <span style="color: rgba(128, 128, 128, 1)">&lt;summary&gt;</span>
      <span style="color: rgba(128, 128, 128, 1)">///</span><span style="color: rgba(0, 128, 0, 1)"> 路由
      </span><span style="color: rgba(128, 128, 128, 1)">///</span> <span style="color: rgba(128, 128, 128, 1)">&lt;/summary&gt;</span>
      <span style="color: rgba(0, 0, 255, 1)">public</span> <span style="color: rgba(0, 0, 255, 1)">string</span> RoutingKey { <span style="color: rgba(0, 0, 255, 1)">get</span>; <span style="color: rgba(0, 0, 255, 1)">private</span> <span style="color: rgba(0, 0, 255, 1)">set</span><span style="color: rgba(0, 0, 0, 1)">; }

      </span><span style="color: rgba(0, 0, 255, 1)">public</span> <span style="color: rgba(0, 0, 255, 1)">void</span><span style="color: rgba(0, 0, 0, 1)"> Commit()
      {
            </span><span style="color: rgba(0, 0, 255, 1)">if</span> (cancellationTokenSource == <span style="color: rgba(0, 0, 255, 1)">null</span> || cancellationTokenSource.IsCancellationRequested) <span style="color: rgba(0, 0, 255, 1)">return</span><span style="color: rgba(0, 0, 0, 1)">;

            cancellationTokenSource.Cancel();
            cancellationTokenSource.Dispose();
            cancellationTokenSource </span>= <span style="color: rgba(0, 0, 255, 1)">null</span><span style="color: rgba(0, 0, 0, 1)">;
      }
    }
    </span><span style="color: rgba(0, 0, 255, 1)">public</span> <span style="color: rgba(0, 0, 255, 1)">class</span><span style="color: rgba(0, 0, 0, 1)"> ListenResult
    {
      CancellationTokenSource cancellationTokenSource;

      </span><span style="color: rgba(128, 128, 128, 1)">///</span> <span style="color: rgba(128, 128, 128, 1)">&lt;summary&gt;</span>
      <span style="color: rgba(128, 128, 128, 1)">///</span><span style="color: rgba(0, 128, 0, 1)"> CancellationToken
      </span><span style="color: rgba(128, 128, 128, 1)">///</span> <span style="color: rgba(128, 128, 128, 1)">&lt;/summary&gt;</span>
      <span style="color: rgba(0, 0, 255, 1)">public</span> CancellationToken Token { <span style="color: rgba(0, 0, 255, 1)">get</span> { <span style="color: rgba(0, 0, 255, 1)">return</span><span style="color: rgba(0, 0, 0, 1)"> cancellationTokenSource.Token; } }
      </span><span style="color: rgba(128, 128, 128, 1)">///</span> <span style="color: rgba(128, 128, 128, 1)">&lt;summary&gt;</span>
      <span style="color: rgba(128, 128, 128, 1)">///</span><span style="color: rgba(0, 128, 0, 1)"> 是否已停止
      </span><span style="color: rgba(128, 128, 128, 1)">///</span> <span style="color: rgba(128, 128, 128, 1)">&lt;/summary&gt;</span>
      <span style="color: rgba(0, 0, 255, 1)">public</span> <span style="color: rgba(0, 0, 255, 1)">bool</span> Stoped { <span style="color: rgba(0, 0, 255, 1)">get</span> { <span style="color: rgba(0, 0, 255, 1)">return</span><span style="color: rgba(0, 0, 0, 1)"> cancellationTokenSource.IsCancellationRequested; } }

      </span><span style="color: rgba(0, 0, 255, 1)">public</span><span style="color: rgba(0, 0, 0, 1)"> ListenResult()
      {
            cancellationTokenSource </span>= <span style="color: rgba(0, 0, 255, 1)">new</span><span style="color: rgba(0, 0, 0, 1)"> CancellationTokenSource();
      }

      </span><span style="color: rgba(128, 128, 128, 1)">///</span> <span style="color: rgba(128, 128, 128, 1)">&lt;summary&gt;</span>
      <span style="color: rgba(128, 128, 128, 1)">///</span><span style="color: rgba(0, 128, 0, 1)"> 停止监听
      </span><span style="color: rgba(128, 128, 128, 1)">///</span> <span style="color: rgba(128, 128, 128, 1)">&lt;/summary&gt;</span>
      <span style="color: rgba(0, 0, 255, 1)">public</span> <span style="color: rgba(0, 0, 255, 1)">void</span><span style="color: rgba(0, 0, 0, 1)"> Stop()
      {
            cancellationTokenSource.Cancel();
      }
    }
}</span></pre>
</div>
<span class="cnblogs_code_collapse">RabbitMQConsumer</span></div>
<p>  测试Demo  </p>
<div class="cnblogs_code">  <img src="https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif" alt="" id="code_img_closed_0e70e567-5b94-4ea6-a0cc-50ce73807f87" class="code_img_closed"><img src="https://images.cnblogs.com/OutliningIndicators/ExpandedBlockStart.gif" alt="" id="code_img_opened_0e70e567-5b94-4ea6-a0cc-50ce73807f87" class="code_img_opened" style="display: none">
<div id="cnblogs_code_open_0e70e567-5b94-4ea6-a0cc-50ce73807f87" class="cnblogs_code_hide">
<pre><span style="color: rgba(0, 0, 255, 1)">using</span><span style="color: rgba(0, 0, 0, 1)"> RabbitMQ.Client;
</span><span style="color: rgba(0, 0, 255, 1)">using</span><span style="color: rgba(0, 0, 0, 1)"> RabbitMQ.Client.Events;
</span><span style="color: rgba(0, 0, 255, 1)">using</span><span style="color: rgba(0, 0, 0, 1)"> System;
</span><span style="color: rgba(0, 0, 255, 1)">using</span><span style="color: rgba(0, 0, 0, 1)"> System.Collections.Generic;
</span><span style="color: rgba(0, 0, 255, 1)">using</span><span style="color: rgba(0, 0, 0, 1)"> System.Text;
</span><span style="color: rgba(0, 0, 255, 1)">using</span><span style="color: rgba(0, 0, 0, 1)"> System.Threading;

</span><span style="color: rgba(0, 0, 255, 1)">namespace</span><span style="color: rgba(0, 0, 0, 1)"> RabbitMQ.ConsoleApp
{
    </span><span style="color: rgba(0, 0, 255, 1)">class</span><span style="color: rgba(0, 0, 0, 1)"> Program
    {
      </span><span style="color: rgba(0, 0, 255, 1)">static</span> <span style="color: rgba(0, 0, 255, 1)">void</span> Main(<span style="color: rgba(0, 0, 255, 1)">string</span><span style="color: rgba(0, 0, 0, 1)">[] args)
      {
            </span><span style="color: rgba(0, 0, 255, 1)">string</span>[] hosts = <span style="color: rgba(0, 0, 255, 1)">new</span> <span style="color: rgba(0, 0, 255, 1)">string</span>[] { <span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">192.168.209.133</span><span style="color: rgba(128, 0, 0, 1)">"</span>, <span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">192.168.209.134</span><span style="color: rgba(128, 0, 0, 1)">"</span>, <span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">192.168.209.135</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)"> };
            </span><span style="color: rgba(0, 0, 255, 1)">int</span> port = <span style="color: rgba(128, 0, 128, 1)">5672</span><span style="color: rgba(0, 0, 0, 1)">;
            </span><span style="color: rgba(0, 0, 255, 1)">string</span> userName = <span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">admin</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">;
            </span><span style="color: rgba(0, 0, 255, 1)">string</span> password = <span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">123456</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">;
            </span><span style="color: rgba(0, 0, 255, 1)">string</span> virtualHost = <span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">/</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">;
            </span><span style="color: rgba(0, 0, 255, 1)">string</span> queue = <span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">queue1</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">;
            </span><span style="color: rgba(0, 0, 255, 1)">var</span> arguments = <span style="color: rgba(0, 0, 255, 1)">new</span> Dictionary&lt;<span style="color: rgba(0, 0, 255, 1)">string</span>, <span style="color: rgba(0, 0, 255, 1)">object</span>&gt;() { { <span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">x-queue-type</span><span style="color: rgba(128, 0, 0, 1)">"</span>, <span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">classic</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)"> } };

            </span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">消费者</span>
            <span style="color: rgba(0, 0, 255, 1)">new</span> Thread(() =&gt;<span style="color: rgba(0, 0, 0, 1)">
            {
                </span><span style="color: rgba(0, 0, 255, 1)">using</span> (RabbitMQConsumer consumer = <span style="color: rgba(0, 0, 255, 1)">new</span><span style="color: rgba(0, 0, 0, 1)"> RabbitMQConsumer(hosts))
                {
                  consumer.UserName </span>=<span style="color: rgba(0, 0, 0, 1)"> userName;
                  consumer.Password </span>=<span style="color: rgba(0, 0, 0, 1)"> password;
                  consumer.Port </span>=<span style="color: rgba(0, 0, 0, 1)"> port;
                  consumer.VirtualHost </span>=<span style="color: rgba(0, 0, 0, 1)"> virtualHost;

                  consumer.Received </span>+= result =&gt;<span style="color: rgba(0, 0, 0, 1)">
                  {
                        Console.WriteLine($</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">接收到数据:{result.Body}</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">);
                        result.Commit();</span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">提交</span>
<span style="color: rgba(0, 0, 0, 1)">                  };
                  consumer.Listen(queue, options </span>=&gt;<span style="color: rgba(0, 0, 0, 1)">
                  {
                        options.AutoAck </span>= <span style="color: rgba(0, 0, 255, 1)">false</span><span style="color: rgba(0, 0, 0, 1)">;
                        options.Arguments </span>=<span style="color: rgba(0, 0, 0, 1)"> arguments;
                  });
                }
            }).Start();

            </span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">消息生产</span>
            <span style="color: rgba(0, 0, 255, 1)">using</span> (RabbitMQProducer producer = <span style="color: rgba(0, 0, 255, 1)">new</span><span style="color: rgba(0, 0, 0, 1)"> RabbitMQProducer(hosts))
            {
                producer.UserName </span>=<span style="color: rgba(0, 0, 0, 1)"> userName;
                producer.Password </span>=<span style="color: rgba(0, 0, 0, 1)"> password;
                producer.Port </span>=<span style="color: rgba(0, 0, 0, 1)"> port;
                producer.VirtualHost </span>=<span style="color: rgba(0, 0, 0, 1)"> virtualHost;

                </span><span style="color: rgba(0, 0, 255, 1)">string</span> message = <span style="color: rgba(128, 0, 0, 1)">""</span><span style="color: rgba(0, 0, 0, 1)">;
                </span><span style="color: rgba(0, 0, 255, 1)">do</span><span style="color: rgba(0, 0, 0, 1)">
                {
                  message </span>=<span style="color: rgba(0, 0, 0, 1)"> Console.ReadLine();
                  </span><span style="color: rgba(0, 0, 255, 1)">if</span> (<span style="color: rgba(0, 0, 255, 1)">string</span><span style="color: rgba(0, 0, 0, 1)">.IsNullOrEmpty(message))
                  {
                        </span><span style="color: rgba(0, 0, 255, 1)">break</span><span style="color: rgba(0, 0, 0, 1)">;
                  }
                  producer.Publish(queue, message, options </span>=&gt; { options.Arguments =<span style="color: rgba(0, 0, 0, 1)"> arguments; });

                } </span><span style="color: rgba(0, 0, 255, 1)">while</span> (<span style="color: rgba(0, 0, 255, 1)">true</span><span style="color: rgba(0, 0, 0, 1)">);
            }
      }
    }
}</span></pre>
</div>
<span class="cnblogs_code_collapse">普通模式</span></div>
<div class="cnblogs_code">  <img src="https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif" alt="" id="code_img_closed_78e4c354-aa17-4dc5-a622-0825de6447af" class="code_img_closed"><img src="https://images.cnblogs.com/OutliningIndicators/ExpandedBlockStart.gif" alt="" id="code_img_opened_78e4c354-aa17-4dc5-a622-0825de6447af" class="code_img_opened" style="display: none">
<div id="cnblogs_code_open_78e4c354-aa17-4dc5-a622-0825de6447af" class="cnblogs_code_hide">
<pre><span style="color: rgba(0, 0, 255, 1)">using</span><span style="color: rgba(0, 0, 0, 1)"> RabbitMQ.Client;
</span><span style="color: rgba(0, 0, 255, 1)">using</span><span style="color: rgba(0, 0, 0, 1)"> RabbitMQ.Client.Events;
</span><span style="color: rgba(0, 0, 255, 1)">using</span><span style="color: rgba(0, 0, 0, 1)"> System;
</span><span style="color: rgba(0, 0, 255, 1)">using</span><span style="color: rgba(0, 0, 0, 1)"> System.Collections.Generic;
</span><span style="color: rgba(0, 0, 255, 1)">using</span><span style="color: rgba(0, 0, 0, 1)"> System.Text;
</span><span style="color: rgba(0, 0, 255, 1)">using</span><span style="color: rgba(0, 0, 0, 1)"> System.Threading;

</span><span style="color: rgba(0, 0, 255, 1)">namespace</span><span style="color: rgba(0, 0, 0, 1)"> RabbitMQ.ConsoleApp
{
    </span><span style="color: rgba(0, 0, 255, 1)">class</span><span style="color: rgba(0, 0, 0, 1)"> Program
    {
      </span><span style="color: rgba(0, 0, 255, 1)">static</span> <span style="color: rgba(0, 0, 255, 1)">void</span> Main(<span style="color: rgba(0, 0, 255, 1)">string</span><span style="color: rgba(0, 0, 0, 1)">[] args)
      {
            </span><span style="color: rgba(0, 0, 255, 1)">string</span>[] hosts = <span style="color: rgba(0, 0, 255, 1)">new</span> <span style="color: rgba(0, 0, 255, 1)">string</span>[] { <span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">192.168.209.133</span><span style="color: rgba(128, 0, 0, 1)">"</span>, <span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">192.168.209.134</span><span style="color: rgba(128, 0, 0, 1)">"</span>, <span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">192.168.209.135</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)"> };
            </span><span style="color: rgba(0, 0, 255, 1)">int</span> port = <span style="color: rgba(128, 0, 128, 1)">5672</span><span style="color: rgba(0, 0, 0, 1)">;
            </span><span style="color: rgba(0, 0, 255, 1)">string</span> userName = <span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">admin</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">;
            </span><span style="color: rgba(0, 0, 255, 1)">string</span> password = <span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">123456</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">;
            </span><span style="color: rgba(0, 0, 255, 1)">string</span> virtualHost = <span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">/</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">;
            </span><span style="color: rgba(0, 0, 255, 1)">string</span> queue = <span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">queue1</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">;
            </span><span style="color: rgba(0, 0, 255, 1)">var</span> arguments = <span style="color: rgba(0, 0, 255, 1)">new</span> Dictionary&lt;<span style="color: rgba(0, 0, 255, 1)">string</span>, <span style="color: rgba(0, 0, 255, 1)">object</span>&gt;() { { <span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">x-queue-type</span><span style="color: rgba(128, 0, 0, 1)">"</span>, <span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">classic</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)"> } };

            </span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">消费者1</span>
            <span style="color: rgba(0, 0, 255, 1)">new</span> Thread(() =&gt;<span style="color: rgba(0, 0, 0, 1)">
            {
                </span><span style="color: rgba(0, 0, 255, 1)">using</span> (RabbitMQConsumer consumer = <span style="color: rgba(0, 0, 255, 1)">new</span><span style="color: rgba(0, 0, 0, 1)"> RabbitMQConsumer(hosts))
                {
                  consumer.UserName </span>=<span style="color: rgba(0, 0, 0, 1)"> userName;
                  consumer.Password </span>=<span style="color: rgba(0, 0, 0, 1)"> password;
                  consumer.Port </span>=<span style="color: rgba(0, 0, 0, 1)"> port;
                  consumer.VirtualHost </span>=<span style="color: rgba(0, 0, 0, 1)"> virtualHost;

                  consumer.Received </span>+= result =&gt;<span style="color: rgba(0, 0, 0, 1)">
                  {
                        Console.WriteLine($</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">消费者1接收到数据:{result.Body}</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">);
                        result.Commit();</span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">提交</span>
<span style="color: rgba(0, 0, 0, 1)">                  };
                  consumer.Listen(queue, options </span>=&gt;<span style="color: rgba(0, 0, 0, 1)">
                  {
                        options.AutoAck </span>= <span style="color: rgba(0, 0, 255, 1)">false</span><span style="color: rgba(0, 0, 0, 1)">;
                        options.Arguments </span>=<span style="color: rgba(0, 0, 0, 1)"> arguments;
                        options.FetchCount </span>= <span style="color: rgba(128, 0, 128, 1)">1</span><span style="color: rgba(0, 0, 0, 1)">;
                  });
                }
            }).Start();

            </span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">消费者2</span>
            <span style="color: rgba(0, 0, 255, 1)">new</span> Thread(() =&gt;<span style="color: rgba(0, 0, 0, 1)">
            {
                </span><span style="color: rgba(0, 0, 255, 1)">using</span> (RabbitMQConsumer consumer = <span style="color: rgba(0, 0, 255, 1)">new</span><span style="color: rgba(0, 0, 0, 1)"> RabbitMQConsumer(hosts))
                {
                  consumer.UserName </span>=<span style="color: rgba(0, 0, 0, 1)"> userName;
                  consumer.Password </span>=<span style="color: rgba(0, 0, 0, 1)"> password;
                  consumer.Port </span>=<span style="color: rgba(0, 0, 0, 1)"> port;
                  consumer.VirtualHost </span>=<span style="color: rgba(0, 0, 0, 1)"> virtualHost;

                  consumer.Received </span>+= result =&gt;<span style="color: rgba(0, 0, 0, 1)">
                  {
                        Console.WriteLine($</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">消费者2接收到数据:{result.Body}</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">);
                        result.Commit();</span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">提交</span>
<span style="color: rgba(0, 0, 0, 1)">                  };
                  consumer.Listen(queue, options </span>=&gt;<span style="color: rgba(0, 0, 0, 1)">
                  {
                        options.AutoAck </span>= <span style="color: rgba(0, 0, 255, 1)">false</span><span style="color: rgba(0, 0, 0, 1)">;
                        options.Arguments </span>=<span style="color: rgba(0, 0, 0, 1)"> arguments;
                        options.FetchCount </span>= <span style="color: rgba(128, 0, 128, 1)">2</span><span style="color: rgba(0, 0, 0, 1)">;
                  });
                }
            }).Start();

            </span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">消息生产</span>
            <span style="color: rgba(0, 0, 255, 1)">using</span> (RabbitMQProducer producer = <span style="color: rgba(0, 0, 255, 1)">new</span><span style="color: rgba(0, 0, 0, 1)"> RabbitMQProducer(hosts))
            {
                producer.UserName </span>=<span style="color: rgba(0, 0, 0, 1)"> userName;
                producer.Password </span>=<span style="color: rgba(0, 0, 0, 1)"> password;
                producer.Port </span>=<span style="color: rgba(0, 0, 0, 1)"> port;
                producer.VirtualHost </span>=<span style="color: rgba(0, 0, 0, 1)"> virtualHost;

                </span><span style="color: rgba(0, 0, 255, 1)">string</span> message = <span style="color: rgba(128, 0, 0, 1)">""</span><span style="color: rgba(0, 0, 0, 1)">;
                </span><span style="color: rgba(0, 0, 255, 1)">do</span><span style="color: rgba(0, 0, 0, 1)">
                {
                  message </span>=<span style="color: rgba(0, 0, 0, 1)"> Console.ReadLine();
                  </span><span style="color: rgba(0, 0, 255, 1)">if</span> (<span style="color: rgba(0, 0, 255, 1)">string</span><span style="color: rgba(0, 0, 0, 1)">.IsNullOrEmpty(message))
                  {
                        </span><span style="color: rgba(0, 0, 255, 1)">break</span><span style="color: rgba(0, 0, 0, 1)">;
                  }
                  producer.Publish(queue, message, options </span>=&gt; { options.Arguments =<span style="color: rgba(0, 0, 0, 1)"> arguments; });

                } </span><span style="color: rgba(0, 0, 255, 1)">while</span> (<span style="color: rgba(0, 0, 255, 1)">true</span><span style="color: rgba(0, 0, 0, 1)">);
            }
      }
    }
}</span></pre>
</div>
<span class="cnblogs_code_collapse">Work模式</span></div>
<div class="cnblogs_code">  <img src="https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif" alt="" id="code_img_closed_f3e778b5-7032-4313-8cc7-e815cb541ac1" class="code_img_closed"><img src="https://images.cnblogs.com/OutliningIndicators/ExpandedBlockStart.gif" alt="" id="code_img_opened_f3e778b5-7032-4313-8cc7-e815cb541ac1" class="code_img_opened" style="display: none">
<div id="cnblogs_code_open_f3e778b5-7032-4313-8cc7-e815cb541ac1" class="cnblogs_code_hide">
<pre><span style="color: rgba(0, 0, 255, 1)">using</span><span style="color: rgba(0, 0, 0, 1)"> RabbitMQ.Client;
</span><span style="color: rgba(0, 0, 255, 1)">using</span><span style="color: rgba(0, 0, 0, 1)"> RabbitMQ.Client.Events;
</span><span style="color: rgba(0, 0, 255, 1)">using</span><span style="color: rgba(0, 0, 0, 1)"> System;
</span><span style="color: rgba(0, 0, 255, 1)">using</span><span style="color: rgba(0, 0, 0, 1)"> System.Collections.Generic;
</span><span style="color: rgba(0, 0, 255, 1)">using</span><span style="color: rgba(0, 0, 0, 1)"> System.Text;
</span><span style="color: rgba(0, 0, 255, 1)">using</span><span style="color: rgba(0, 0, 0, 1)"> System.Threading;

</span><span style="color: rgba(0, 0, 255, 1)">namespace</span><span style="color: rgba(0, 0, 0, 1)"> RabbitMQ.ConsoleApp
{
    </span><span style="color: rgba(0, 0, 255, 1)">class</span><span style="color: rgba(0, 0, 0, 1)"> Program
    {
      </span><span style="color: rgba(0, 0, 255, 1)">static</span> <span style="color: rgba(0, 0, 255, 1)">void</span> Main(<span style="color: rgba(0, 0, 255, 1)">string</span><span style="color: rgba(0, 0, 0, 1)">[] args)
      {
            </span><span style="color: rgba(0, 0, 255, 1)">string</span>[] hosts = <span style="color: rgba(0, 0, 255, 1)">new</span> <span style="color: rgba(0, 0, 255, 1)">string</span>[] { <span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">192.168.209.133</span><span style="color: rgba(128, 0, 0, 1)">"</span>, <span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">192.168.209.134</span><span style="color: rgba(128, 0, 0, 1)">"</span>, <span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">192.168.209.135</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)"> };
            </span><span style="color: rgba(0, 0, 255, 1)">int</span> port = <span style="color: rgba(128, 0, 128, 1)">5672</span><span style="color: rgba(0, 0, 0, 1)">;
            </span><span style="color: rgba(0, 0, 255, 1)">string</span> userName = <span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">admin</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">;
            </span><span style="color: rgba(0, 0, 255, 1)">string</span> password = <span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">123456</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">;
            </span><span style="color: rgba(0, 0, 255, 1)">string</span> virtualHost = <span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">/</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">;
            </span><span style="color: rgba(0, 0, 255, 1)">string</span> queue1 = <span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">queue1</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">;
            </span><span style="color: rgba(0, 0, 255, 1)">string</span> queue2 = <span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">queue2</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">;
            </span><span style="color: rgba(0, 0, 255, 1)">string</span> exchange = <span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">demo.fanout</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">;
            </span><span style="color: rgba(0, 0, 255, 1)">string</span> exchangeType =<span style="color: rgba(0, 0, 0, 1)"> RabbitMQExchangeType.Fanout;
            </span><span style="color: rgba(0, 0, 255, 1)">var</span> arguments = <span style="color: rgba(0, 0, 255, 1)">new</span> Dictionary&lt;<span style="color: rgba(0, 0, 255, 1)">string</span>, <span style="color: rgba(0, 0, 255, 1)">object</span>&gt;() { { <span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">x-queue-type</span><span style="color: rgba(128, 0, 0, 1)">"</span>, <span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">classic</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)"> } };

            </span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">消费者1</span>
            <span style="color: rgba(0, 0, 255, 1)">new</span> Thread(() =&gt;<span style="color: rgba(0, 0, 0, 1)">
            {
                </span><span style="color: rgba(0, 0, 255, 1)">using</span> (RabbitMQConsumer consumer = <span style="color: rgba(0, 0, 255, 1)">new</span><span style="color: rgba(0, 0, 0, 1)"> RabbitMQConsumer(hosts))
                {
                  consumer.UserName </span>=<span style="color: rgba(0, 0, 0, 1)"> userName;
                  consumer.Password </span>=<span style="color: rgba(0, 0, 0, 1)"> password;
                  consumer.Port </span>=<span style="color: rgba(0, 0, 0, 1)"> port;
                  consumer.VirtualHost </span>=<span style="color: rgba(0, 0, 0, 1)"> virtualHost;

                  consumer.Received </span>+= result =&gt;<span style="color: rgba(0, 0, 0, 1)">
                  {
                        Console.WriteLine($</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">消费者1接收到数据:{result.Body}</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">);
                        result.Commit();</span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">提交</span>
<span style="color: rgba(0, 0, 0, 1)">                  };
                  consumer.Listen(queue1, options </span>=&gt;<span style="color: rgba(0, 0, 0, 1)">
                  {
                        options.AutoAck </span>= <span style="color: rgba(0, 0, 255, 1)">false</span><span style="color: rgba(0, 0, 0, 1)">;
                        options.Arguments </span>=<span style="color: rgba(0, 0, 0, 1)"> arguments;
                  });
                }
            }).Start();

            </span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">消费者2</span>
            <span style="color: rgba(0, 0, 255, 1)">new</span> Thread(() =&gt;<span style="color: rgba(0, 0, 0, 1)">
            {
                </span><span style="color: rgba(0, 0, 255, 1)">using</span> (RabbitMQConsumer consumer = <span style="color: rgba(0, 0, 255, 1)">new</span><span style="color: rgba(0, 0, 0, 1)"> RabbitMQConsumer(hosts))
                {
                  consumer.UserName </span>=<span style="color: rgba(0, 0, 0, 1)"> userName;
                  consumer.Password </span>=<span style="color: rgba(0, 0, 0, 1)"> password;
                  consumer.Port </span>=<span style="color: rgba(0, 0, 0, 1)"> port;
                  consumer.VirtualHost </span>=<span style="color: rgba(0, 0, 0, 1)"> virtualHost;

                  consumer.Received </span>+= result =&gt;<span style="color: rgba(0, 0, 0, 1)">
                  {
                        Console.WriteLine($</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">消费者2接收到数据:{result.Body}</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">);
                        result.Commit();</span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">提交</span>
<span style="color: rgba(0, 0, 0, 1)">                  };
                  consumer.Listen(queue2, options </span>=&gt;<span style="color: rgba(0, 0, 0, 1)">
                  {
                        options.AutoAck </span>= <span style="color: rgba(0, 0, 255, 1)">false</span><span style="color: rgba(0, 0, 0, 1)">;
                        options.Arguments </span>=<span style="color: rgba(0, 0, 0, 1)"> arguments;
                  });
                }
            }).Start();

            </span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">消息生产</span>
            <span style="color: rgba(0, 0, 255, 1)">using</span> (RabbitMQProducer producer = <span style="color: rgba(0, 0, 255, 1)">new</span><span style="color: rgba(0, 0, 0, 1)"> RabbitMQProducer(hosts))
            {
                producer.UserName </span>=<span style="color: rgba(0, 0, 0, 1)"> userName;
                producer.Password </span>=<span style="color: rgba(0, 0, 0, 1)"> password;
                producer.Port </span>=<span style="color: rgba(0, 0, 0, 1)"> port;
                producer.VirtualHost </span>=<span style="color: rgba(0, 0, 0, 1)"> virtualHost;

                </span><span style="color: rgba(0, 0, 255, 1)">string</span> message = <span style="color: rgba(128, 0, 0, 1)">""</span><span style="color: rgba(0, 0, 0, 1)">;
                </span><span style="color: rgba(0, 0, 255, 1)">do</span><span style="color: rgba(0, 0, 0, 1)">
                {
                  message </span>=<span style="color: rgba(0, 0, 0, 1)"> Console.ReadLine();
                  </span><span style="color: rgba(0, 0, 255, 1)">if</span> (<span style="color: rgba(0, 0, 255, 1)">string</span><span style="color: rgba(0, 0, 0, 1)">.IsNullOrEmpty(message))
                  {
                        </span><span style="color: rgba(0, 0, 255, 1)">break</span><span style="color: rgba(0, 0, 0, 1)">;
                  }
                  producer.Publish(exchange, </span><span style="color: rgba(128, 0, 0, 1)">""</span>, message, options =&gt; { options.Type =<span style="color: rgba(0, 0, 0, 1)"> exchangeType; });

                } </span><span style="color: rgba(0, 0, 255, 1)">while</span> (<span style="color: rgba(0, 0, 255, 1)">true</span><span style="color: rgba(0, 0, 0, 1)">);
            }
      }
    }
}</span></pre>
</div>
<span class="cnblogs_code_collapse">发布订阅模式</span></div>
<div class="cnblogs_code">  <img src="https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif" alt="" id="code_img_closed_0cf71c08-3285-4f8b-ac3e-b0be29c07f8f" class="code_img_closed"><img src="https://images.cnblogs.com/OutliningIndicators/ExpandedBlockStart.gif" alt="" id="code_img_opened_0cf71c08-3285-4f8b-ac3e-b0be29c07f8f" class="code_img_opened" style="display: none">
<div id="cnblogs_code_open_0cf71c08-3285-4f8b-ac3e-b0be29c07f8f" class="cnblogs_code_hide">
<pre><span style="color: rgba(0, 0, 255, 1)">using</span><span style="color: rgba(0, 0, 0, 1)"> RabbitMQ.Client;
</span><span style="color: rgba(0, 0, 255, 1)">using</span><span style="color: rgba(0, 0, 0, 1)"> RabbitMQ.Client.Events;
</span><span style="color: rgba(0, 0, 255, 1)">using</span><span style="color: rgba(0, 0, 0, 1)"> System;
</span><span style="color: rgba(0, 0, 255, 1)">using</span><span style="color: rgba(0, 0, 0, 1)"> System.Collections.Generic;
</span><span style="color: rgba(0, 0, 255, 1)">using</span><span style="color: rgba(0, 0, 0, 1)"> System.Text;
</span><span style="color: rgba(0, 0, 255, 1)">using</span><span style="color: rgba(0, 0, 0, 1)"> System.Threading;

</span><span style="color: rgba(0, 0, 255, 1)">namespace</span><span style="color: rgba(0, 0, 0, 1)"> RabbitMQ.ConsoleApp
{
    </span><span style="color: rgba(0, 0, 255, 1)">class</span><span style="color: rgba(0, 0, 0, 1)"> Program
    {
      </span><span style="color: rgba(0, 0, 255, 1)">static</span> <span style="color: rgba(0, 0, 255, 1)">void</span> Main(<span style="color: rgba(0, 0, 255, 1)">string</span><span style="color: rgba(0, 0, 0, 1)">[] args)
      {
            </span><span style="color: rgba(0, 0, 255, 1)">string</span>[] hosts = <span style="color: rgba(0, 0, 255, 1)">new</span> <span style="color: rgba(0, 0, 255, 1)">string</span>[] { <span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">192.168.209.133</span><span style="color: rgba(128, 0, 0, 1)">"</span>, <span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">192.168.209.134</span><span style="color: rgba(128, 0, 0, 1)">"</span>, <span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">192.168.209.135</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)"> };
            </span><span style="color: rgba(0, 0, 255, 1)">int</span> port = <span style="color: rgba(128, 0, 128, 1)">5672</span><span style="color: rgba(0, 0, 0, 1)">;
            </span><span style="color: rgba(0, 0, 255, 1)">string</span> userName = <span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">admin</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">;
            </span><span style="color: rgba(0, 0, 255, 1)">string</span> password = <span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">123456</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">;
            </span><span style="color: rgba(0, 0, 255, 1)">string</span> virtualHost = <span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">/</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">;
            </span><span style="color: rgba(0, 0, 255, 1)">string</span> queue1 = <span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">queue1</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">;
            </span><span style="color: rgba(0, 0, 255, 1)">string</span> queue2 = <span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">queue2</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">;
            </span><span style="color: rgba(0, 0, 255, 1)">string</span> exchange = <span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">demo.direct</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">;
            </span><span style="color: rgba(0, 0, 255, 1)">string</span> exchangeType =<span style="color: rgba(0, 0, 0, 1)"> RabbitMQExchangeType.Direct;
            </span><span style="color: rgba(0, 0, 255, 1)">var</span> arguments = <span style="color: rgba(0, 0, 255, 1)">new</span> Dictionary&lt;<span style="color: rgba(0, 0, 255, 1)">string</span>, <span style="color: rgba(0, 0, 255, 1)">object</span>&gt;() { { <span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">x-queue-type</span><span style="color: rgba(128, 0, 0, 1)">"</span>, <span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">classic</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)"> } };

            </span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">消费者1</span>
            <span style="color: rgba(0, 0, 255, 1)">new</span> Thread(() =&gt;<span style="color: rgba(0, 0, 0, 1)">
            {
                </span><span style="color: rgba(0, 0, 255, 1)">using</span> (RabbitMQConsumer consumer = <span style="color: rgba(0, 0, 255, 1)">new</span><span style="color: rgba(0, 0, 0, 1)"> RabbitMQConsumer(hosts))
                {
                  consumer.UserName </span>=<span style="color: rgba(0, 0, 0, 1)"> userName;
                  consumer.Password </span>=<span style="color: rgba(0, 0, 0, 1)"> password;
                  consumer.Port </span>=<span style="color: rgba(0, 0, 0, 1)"> port;
                  consumer.VirtualHost </span>=<span style="color: rgba(0, 0, 0, 1)"> virtualHost;

                  consumer.Received </span>+= result =&gt;<span style="color: rgba(0, 0, 0, 1)">
                  {
                        Console.WriteLine($</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">消费者1接收到数据:{result.Body}</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">);
                        result.Commit();</span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">提交</span>
<span style="color: rgba(0, 0, 0, 1)">                  };
                  consumer.Listen(queue1, options </span>=&gt;<span style="color: rgba(0, 0, 0, 1)">
                  {
                        options.AutoAck </span>= <span style="color: rgba(0, 0, 255, 1)">false</span><span style="color: rgba(0, 0, 0, 1)">;
                        options.Arguments </span>=<span style="color: rgba(0, 0, 0, 1)"> arguments;
                  });
                }
            }).Start();

            </span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">消费者2</span>
            <span style="color: rgba(0, 0, 255, 1)">new</span> Thread(() =&gt;<span style="color: rgba(0, 0, 0, 1)">
            {
                </span><span style="color: rgba(0, 0, 255, 1)">using</span> (RabbitMQConsumer consumer = <span style="color: rgba(0, 0, 255, 1)">new</span><span style="color: rgba(0, 0, 0, 1)"> RabbitMQConsumer(hosts))
                {
                  consumer.UserName </span>=<span style="color: rgba(0, 0, 0, 1)"> userName;
                  consumer.Password </span>=<span style="color: rgba(0, 0, 0, 1)"> password;
                  consumer.Port </span>=<span style="color: rgba(0, 0, 0, 1)"> port;
                  consumer.VirtualHost </span>=<span style="color: rgba(0, 0, 0, 1)"> virtualHost;

                  consumer.Received </span>+= result =&gt;<span style="color: rgba(0, 0, 0, 1)">
                  {
                        Console.WriteLine($</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">消费者2接收到数据:{result.Body}</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">);
                        result.Commit();</span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">提交</span>
<span style="color: rgba(0, 0, 0, 1)">                  };
                  consumer.Listen(queue2, options </span>=&gt;<span style="color: rgba(0, 0, 0, 1)">
                  {
                        options.AutoAck </span>= <span style="color: rgba(0, 0, 255, 1)">false</span><span style="color: rgba(0, 0, 0, 1)">;
                        options.Arguments </span>=<span style="color: rgba(0, 0, 0, 1)"> arguments;
                  });
                }
            }).Start();

            </span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">消息生产</span>
            <span style="color: rgba(0, 0, 255, 1)">using</span> (RabbitMQProducer producer = <span style="color: rgba(0, 0, 255, 1)">new</span><span style="color: rgba(0, 0, 0, 1)"> RabbitMQProducer(hosts))
            {
                producer.UserName </span>=<span style="color: rgba(0, 0, 0, 1)"> userName;
                producer.Password </span>=<span style="color: rgba(0, 0, 0, 1)"> password;
                producer.Port </span>=<span style="color: rgba(0, 0, 0, 1)"> port;
                producer.VirtualHost </span>=<span style="color: rgba(0, 0, 0, 1)"> virtualHost;

                </span><span style="color: rgba(0, 0, 255, 1)">string</span> message = <span style="color: rgba(128, 0, 0, 1)">""</span><span style="color: rgba(0, 0, 0, 1)">;
                </span><span style="color: rgba(0, 0, 255, 1)">int</span> index = <span style="color: rgba(128, 0, 128, 1)">1</span><span style="color: rgba(0, 0, 0, 1)">;
                </span><span style="color: rgba(0, 0, 255, 1)">string</span>[] routes = <span style="color: rgba(0, 0, 255, 1)">new</span> <span style="color: rgba(0, 0, 255, 1)">string</span>[] { <span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">apple</span><span style="color: rgba(128, 0, 0, 1)">"</span>, <span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">banana</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)"> };
                </span><span style="color: rgba(0, 0, 255, 1)">do</span><span style="color: rgba(0, 0, 0, 1)">
                {
                  message </span>=<span style="color: rgba(0, 0, 0, 1)"> Console.ReadLine();
                  </span><span style="color: rgba(0, 0, 255, 1)">if</span> (<span style="color: rgba(0, 0, 255, 1)">string</span><span style="color: rgba(0, 0, 0, 1)">.IsNullOrEmpty(message))
                  {
                        </span><span style="color: rgba(0, 0, 255, 1)">break</span><span style="color: rgba(0, 0, 0, 1)">;
                  }
                  </span><span style="color: rgba(0, 0, 255, 1)">var</span> route = routes;
                  producer.Publish(exchange, route, message, options </span>=&gt; { options.Type =<span style="color: rgba(0, 0, 0, 1)"> exchangeType; });

                } </span><span style="color: rgba(0, 0, 255, 1)">while</span> (<span style="color: rgba(0, 0, 255, 1)">true</span><span style="color: rgba(0, 0, 0, 1)">);
            }
      }
    }
}</span></pre>
</div>
<span class="cnblogs_code_collapse">路由模式</span></div>
<div class="cnblogs_code">  <img src="https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif" alt="" id="code_img_closed_d5e304eb-29dc-448b-bd31-a1d215848b63" class="code_img_closed"><img src="https://images.cnblogs.com/OutliningIndicators/ExpandedBlockStart.gif" alt="" id="code_img_opened_d5e304eb-29dc-448b-bd31-a1d215848b63" class="code_img_opened" style="display: none">
<div id="cnblogs_code_open_d5e304eb-29dc-448b-bd31-a1d215848b63" class="cnblogs_code_hide">
<pre><span style="color: rgba(0, 0, 255, 1)">using</span><span style="color: rgba(0, 0, 0, 1)"> RabbitMQ.Client;
</span><span style="color: rgba(0, 0, 255, 1)">using</span><span style="color: rgba(0, 0, 0, 1)"> RabbitMQ.Client.Events;
</span><span style="color: rgba(0, 0, 255, 1)">using</span><span style="color: rgba(0, 0, 0, 1)"> System;
</span><span style="color: rgba(0, 0, 255, 1)">using</span><span style="color: rgba(0, 0, 0, 1)"> System.Collections.Generic;
</span><span style="color: rgba(0, 0, 255, 1)">using</span><span style="color: rgba(0, 0, 0, 1)"> System.Text;
</span><span style="color: rgba(0, 0, 255, 1)">using</span><span style="color: rgba(0, 0, 0, 1)"> System.Threading;

</span><span style="color: rgba(0, 0, 255, 1)">namespace</span><span style="color: rgba(0, 0, 0, 1)"> RabbitMQ.ConsoleApp
{
    </span><span style="color: rgba(0, 0, 255, 1)">class</span><span style="color: rgba(0, 0, 0, 1)"> Program
    {
      </span><span style="color: rgba(0, 0, 255, 1)">static</span> <span style="color: rgba(0, 0, 255, 1)">void</span> Main(<span style="color: rgba(0, 0, 255, 1)">string</span><span style="color: rgba(0, 0, 0, 1)">[] args)
      {
            </span><span style="color: rgba(0, 0, 255, 1)">string</span>[] hosts = <span style="color: rgba(0, 0, 255, 1)">new</span> <span style="color: rgba(0, 0, 255, 1)">string</span>[] { <span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">192.168.209.133</span><span style="color: rgba(128, 0, 0, 1)">"</span>, <span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">192.168.209.134</span><span style="color: rgba(128, 0, 0, 1)">"</span>, <span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">192.168.209.135</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)"> };
            </span><span style="color: rgba(0, 0, 255, 1)">int</span> port = <span style="color: rgba(128, 0, 128, 1)">5672</span><span style="color: rgba(0, 0, 0, 1)">;
            </span><span style="color: rgba(0, 0, 255, 1)">string</span> userName = <span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">admin</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">;
            </span><span style="color: rgba(0, 0, 255, 1)">string</span> password = <span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">123456</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">;
            </span><span style="color: rgba(0, 0, 255, 1)">string</span> virtualHost = <span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">/</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">;
            </span><span style="color: rgba(0, 0, 255, 1)">string</span> queue1 = <span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">queue1</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">;
            </span><span style="color: rgba(0, 0, 255, 1)">string</span> queue2 = <span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">queue2</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">;
            </span><span style="color: rgba(0, 0, 255, 1)">string</span> exchange = <span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">demo.topic</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">;
            </span><span style="color: rgba(0, 0, 255, 1)">string</span> exchangeType =<span style="color: rgba(0, 0, 0, 1)"> RabbitMQExchangeType.Topic;
            </span><span style="color: rgba(0, 0, 255, 1)">var</span> arguments = <span style="color: rgba(0, 0, 255, 1)">new</span> Dictionary&lt;<span style="color: rgba(0, 0, 255, 1)">string</span>, <span style="color: rgba(0, 0, 255, 1)">object</span>&gt;() { { <span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">x-queue-type</span><span style="color: rgba(128, 0, 0, 1)">"</span>, <span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">classic</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)"> } };

            </span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">消费者1</span>
            <span style="color: rgba(0, 0, 255, 1)">new</span> Thread(() =&gt;<span style="color: rgba(0, 0, 0, 1)">
            {
                </span><span style="color: rgba(0, 0, 255, 1)">using</span> (RabbitMQConsumer consumer = <span style="color: rgba(0, 0, 255, 1)">new</span><span style="color: rgba(0, 0, 0, 1)"> RabbitMQConsumer(hosts))
                {
                  consumer.UserName </span>=<span style="color: rgba(0, 0, 0, 1)"> userName;
                  consumer.Password </span>=<span style="color: rgba(0, 0, 0, 1)"> password;
                  consumer.Port </span>=<span style="color: rgba(0, 0, 0, 1)"> port;
                  consumer.VirtualHost </span>=<span style="color: rgba(0, 0, 0, 1)"> virtualHost;

                  consumer.Received </span>+= result =&gt;<span style="color: rgba(0, 0, 0, 1)">
                  {
                        Console.WriteLine($</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">消费者1接收到数据:{result.Body}</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">);
                        result.Commit();</span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">提交</span>
<span style="color: rgba(0, 0, 0, 1)">                  };
                  consumer.Listen(queue1, options </span>=&gt;<span style="color: rgba(0, 0, 0, 1)">
                  {
                        options.AutoAck </span>= <span style="color: rgba(0, 0, 255, 1)">false</span><span style="color: rgba(0, 0, 0, 1)">;
                        options.Arguments </span>=<span style="color: rgba(0, 0, 0, 1)"> arguments;
                  });
                }
            }).Start();

            </span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">消费者2</span>
            <span style="color: rgba(0, 0, 255, 1)">new</span> Thread(() =&gt;<span style="color: rgba(0, 0, 0, 1)">
            {
                </span><span style="color: rgba(0, 0, 255, 1)">using</span> (RabbitMQConsumer consumer = <span style="color: rgba(0, 0, 255, 1)">new</span><span style="color: rgba(0, 0, 0, 1)"> RabbitMQConsumer(hosts))
                {
                  consumer.UserName </span>=<span style="color: rgba(0, 0, 0, 1)"> userName;
                  consumer.Password </span>=<span style="color: rgba(0, 0, 0, 1)"> password;
                  consumer.Port </span>=<span style="color: rgba(0, 0, 0, 1)"> port;
                  consumer.VirtualHost </span>=<span style="color: rgba(0, 0, 0, 1)"> virtualHost;

                  consumer.Received </span>+= result =&gt;<span style="color: rgba(0, 0, 0, 1)">
                  {
                        Console.WriteLine($</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">消费者2接收到数据:{result.Body}</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">);
                        result.Commit();</span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">提交</span>
<span style="color: rgba(0, 0, 0, 1)">                  };
                  consumer.Listen(queue2, options </span>=&gt;<span style="color: rgba(0, 0, 0, 1)">
                  {
                        options.AutoAck </span>= <span style="color: rgba(0, 0, 255, 1)">false</span><span style="color: rgba(0, 0, 0, 1)">;
                        options.Arguments </span>=<span style="color: rgba(0, 0, 0, 1)"> arguments;
                  });
                }
            }).Start();

            </span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">消息生产</span>
            <span style="color: rgba(0, 0, 255, 1)">using</span> (RabbitMQProducer producer = <span style="color: rgba(0, 0, 255, 1)">new</span><span style="color: rgba(0, 0, 0, 1)"> RabbitMQProducer(hosts))
            {
                producer.UserName </span>=<span style="color: rgba(0, 0, 0, 1)"> userName;
                producer.Password </span>=<span style="color: rgba(0, 0, 0, 1)"> password;
                producer.Port </span>=<span style="color: rgba(0, 0, 0, 1)"> port;
                producer.VirtualHost </span>=<span style="color: rgba(0, 0, 0, 1)"> virtualHost;

                </span><span style="color: rgba(0, 0, 255, 1)">string</span> message = <span style="color: rgba(128, 0, 0, 1)">""</span><span style="color: rgba(0, 0, 0, 1)">;
                </span><span style="color: rgba(0, 0, 255, 1)">int</span> index = <span style="color: rgba(128, 0, 128, 1)">1</span><span style="color: rgba(0, 0, 0, 1)">;
                </span><span style="color: rgba(0, 0, 255, 1)">string</span>[] routes = <span style="color: rgba(0, 0, 255, 1)">new</span> <span style="color: rgba(0, 0, 255, 1)">string</span>[] { <span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">apple.</span><span style="color: rgba(128, 0, 0, 1)">"</span>, <span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">banana.</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)"> };
                </span><span style="color: rgba(0, 0, 255, 1)">do</span><span style="color: rgba(0, 0, 0, 1)">
                {
                  message </span>=<span style="color: rgba(0, 0, 0, 1)"> Console.ReadLine();
                  </span><span style="color: rgba(0, 0, 255, 1)">if</span> (<span style="color: rgba(0, 0, 255, 1)">string</span><span style="color: rgba(0, 0, 0, 1)">.IsNullOrEmpty(message))
                  {
                        </span><span style="color: rgba(0, 0, 255, 1)">break</span><span style="color: rgba(0, 0, 0, 1)">;
                  }
                  </span><span style="color: rgba(0, 0, 255, 1)">var</span> route = routes + index++<span style="color: rgba(0, 0, 0, 1)">;
                  producer.Publish(exchange, route, message, options </span>=&gt; { options.Type =<span style="color: rgba(0, 0, 0, 1)"> exchangeType; });

                } </span><span style="color: rgba(0, 0, 255, 1)">while</span> (<span style="color: rgba(0, 0, 255, 1)">true</span><span style="color: rgba(0, 0, 0, 1)">);
            }
      }
    }
}</span></pre>
</div>
<span class="cnblogs_code_collapse">主题模式</span></div>
<p>  <span style="color: rgba(255, 0, 0, 1)">上面是我自己做的封装,因为RabbitMQ.Client功能齐全,但是使用比较麻烦,需要编写的代码多一些,推荐一下第三方对rabbitmq的封装插件:EasyNetQ,它是建立在RabbitMQ.Client上的,多数时候可以直接通过EasyNetQ就可以完成消息发布与消费,感兴趣的可以了解一下</span></p>

</div>
<div id="MySignature" role="contentinfo">
      <div class="lightSignature">
      <span>一个专注于.NetCore的技术小白</span>
    </div><br><br>
来源:https://www.cnblogs.com/shanfeng1000/p/12133181.html
頁: [1]
查看完整版本: C# .net 环境下使用rabbitmq消息队列