众所周知RabbitMQ使用的是AMQP协议。我们知道AMQP是一种网络协议,能够支持符合要求的客户端应用和消息中间件代理之间进行通信。

其中消息代理扮演的角色就是从生产者那儿接受消息,并根据既定的路由规则把接受到的消息发送给消息的处理者又称消费者。由此可以看出RabbitMQ在整个消息发送,处理的过程中有三个比较重要的角色:

生产者:producer,消息生产者,就是投递消息的程序

消息代理:broker,简单来说就是消息队列服务器实体,这里简单理解为我们安装的RabbitMQ服务

消费者:consumer,消息消费者,就是接受消息的程序

接下来我们将以一个简单的控制台程序来实现消息队列的发送及接收(使用.NET版RabbitMQ客户端):

主要功能为: 一个producer发送消息,一个consumer接收消息,并在控制台打印出来。

使用Nuget添加RabbitMQ.Client程序包至项目中

Install-Package RabbitMQ.Client

创建消息的生产者 Producer.cs ,发送一条消息给消费者

  1. using RabbitMQ.Client;
  2. using System;
  3. using System.Text;
  4. namespace RabbitMQProducer
  5. {
  6.     public class Producer
  7.     {
  8.         public static void Send()
  9.         {
  10.             //创建连接连接到RabbitMQ服务器,就是一个位于客户端和Broker之间的TCP连接,建议共用此TCP连接,每次使用时创建一个新的channel即可,
  11.             var factory = new ConnectionFactory();
  12.             IConnection connection = null;
  13.             //方式1:使用AMQP协议URL amqp://username:password@hostname:port/virtual host 可通过http://127.0.0.1:15672/ RabbitMQWeb管理页面查看每个参数的具体内容
  14.             factory.Uri = "amqp://guest:guest@127.0.0.1:5672//";
  15.             connection = factory.CreateConnection();
  16.             方式2:使用ConnectionFactory属性赋值
  17.             //factory.UserName = ConnectionFactory.DefaultUser;
  18.             //factory.Password = ConnectionFactory.DefaultPass;
  19.             //factory.VirtualHost = ConnectionFactory.DefaultVHost;
  20.             //factory.HostName = "127.0.0.1"; //设置RabbitMQ服务器所在的IP或主机名
  21.             //factory.Port = AmqpTcpEndpoint.UseDefaultPort;
  22.             //connection = factory.CreateConnection();
  23.             方式3:使用CreateConnection方法创建连接,默认使用第一个地址连接服务端,如果第一个不可用会依次使用后面的连接
  24.             //List<AmqpTcpEndpoint> endpoints = new List<AmqpTcpEndpoint>() {
  25.             // new AmqpTcpEndpoint() { HostName="localhost1",Port=5672},
  26.             // new AmqpTcpEndpoint() { HostName="localhost2",Port=5672},
  27.             // new AmqpTcpEndpoint() { HostName="localhost3",Port=5672},
  28.             // new AmqpTcpEndpoint() { HostName="localhost4",Port=5672}
  29.             //};
  30.             //connection = factory.CreateConnection(endpoints);
  31.             using (connection)
  32.             {
  33.                 //创建一个消息通道,在客户端的每个连接里,可建立多个channel,每个channel代表一个会话任务。类似与Hibernate中的Session
  34.                 //AMQP协议规定只有通过channel才能指定AMQP命令,所以仅仅在创建了connection后客户端还是不能发送消息的,必须要创建一个channel才行
  35.                 //RabbitMQ建议客户端线程之间不要共用Channel,至少要保证共用Channel的线程发送消息必须是串行的,但是建议尽量共用Connection
  36.                 using (IModel channel = connection.CreateModel())
  37.                 {
  38.                     //创建一个queue(消息队列)
  39.                     channel.QueueDeclare(
  40.                         queue: "hello",
  41.                         durable: false,
  42.                         exclusive: false,
  43.                         autoDelete: false,
  44.                         arguments: null);
  45.                     string message = "你好消费者,我是生产者发送的消息";
  46.                     //往队列中发出一条消息 使用了默认交换机并且绑定路由键(route key)与队列名称相同
  47.                     channel.BasicPublish(
  48.                         exchange: "",
  49.                         routingKey: "hello",
  50.                         basicProperties: null,
  51.                         body: Encoding.UTF8.GetBytes(message));
  52.                     Console.WriteLine($"我是生产者,我发送了一条消息{message}");
  53.                     Console.WriteLine(" Press [enter] to exit.");
  54.                     Console.ReadLine();
  55.                 }
  56.             }
  57.         }
  58.     }
  59. }

注意:1.队列只会在它不存在的时候创建,多次声明并不会重复创建。

2.信息的内容是字节数组,也就意味着可以传递任何数据。

3.创建消息的消费者Consumer.cs ,从队列中获取消息并打印到屏幕

  1. using RabbitMQ.Client;
  2. using RabbitMQ.Client.Events;
  3. using System;
  4. using System.Text;
  5. namespace RabbitMQConsumer
  6. {
  7.     public class Consumer
  8.     {
  9.         public static void Receive()
  10.         {
  11.             var factory = new ConnectionFactory();
  12.             factory.Uri = "amqp://guest:guest@127.0.0.1:5672//";
  13.             using (var connection = factory.CreateConnection())
  14.             {
  15.                 using (var channel = connection.CreateModel())
  16.                 {
  17.                     //声明队列,主要为了防止消息接收者先运行此程序,队列还不存在时创建队列
  18.                     channel.QueueDeclare(
  19.                         queue: "hello",
  20.                         durable: false,
  21.                         exclusive: false,
  22.                         autoDelete: false,
  23.                         arguments: null);
  24.                     //创建事件驱动的消费者类型,尽量不要使用while(ture)循环来获取消息
  25.                     EventingBasicConsumer consumer = new EventingBasicConsumer(channel);
  26.                     consumer.Received += (model, ea) =>
  27.                     {
  28.                         var body = ea.Body;
  29.                         var message = Encoding.UTF8.GetString(body);
  30.                         Console.WriteLine(" 我是消费者我接收到消息: {0}", message);
  31.                     };
  32.                     //指定消费队列
  33.                     channel.BasicConsume(queue: "hello",
  34.                                          noAck: true,
  35.                                          consumer: consumer);
  36.                     Console.WriteLine(" Press [enter] to exit.");
  37.                     Console.ReadLine();
  38.                 }
  39.             }
  40.         }
  41.     }
  42. }

消息队列的使用过程大致如下:

  • CreateConnection 创建一个连接连接到broker
  • CreateModel 创建一个channel 使用它来发送AMQP指令
  • ExchangeDeclare 创建一个exchange 对消息进行路由
  • QueueDeclare 创建一个queue 消息队列 这是一个装载消息的容器
  • QueueBind 把exchange和queue按照路由规则绑定起来
  • BasicPublish 往队列中发送一条消息
  • BasicConsume 从队列中获取一条消息

exchange接收到消息后,就根据消息的key和已经设置的binding,进行消息路由,将消息投递到一个或多个队列里。

本文中由于使用了默认交换机所以并没有用到 ExchangeDeclare和 QueueBind两个方法

默认交换机实际上是一个由消息代理预先声明好的没有名字(名字为空字符串)的直连交换机。它有一个特殊的属性使得它对于简单应用特别有用处:那就是每个新建队列(queue)都会自动绑定到默认交换机上,绑定的路由键(routing key)名称与队列名称相同

转载于:https://www.cnblogs.com/AlvinLee/p/6141834.html

RabbitMQ入门教程——.NET客户端使用相关推荐

  1. RabbitMQ入门教程(安装,管理插件,Publisher/Consumer/交换机/路由/队列/绑定关系,及如何保证100%投递等)

    RabbitMQ入门教程(安装,管理插件,Publisher/Consumer/交换机/路由/队列/绑定关系,及如何保证100%投递等) 1. RabbitMQ简介及AMQP协议 开源的消息代理和队列 ...

  2. 干货!消息队列RabbitMQ入门教程

    ​写在前面:全文12000多字,从为什么需要用消息队列,到rabbitMQ安装使用,如何使用JavaAPI生产消费消息,以及使用消息队列带来的一些常见问题.绝对很适合新手入门学习. 为什么需要消息队列 ...

  3. RabbitMQ 入门教程(PHP版) 第三部分:发布/订阅(Publish/Subscribe)

    发布/订阅 在上篇第二部分教程中,我们搭建了一个工作队列.每个任务之分发给一个工作者(worker).在本篇教程中,我们要做的之前完全不一样--分发一个消息给多个消费者(consumers).这种模式 ...

  4. RabbitMQ入门教程 1

    一.MQ的基本概念 1.MQ的概述 2.MQ的优势 应用解耦 异步提速 削峰填谷 3.MQ的劣势 系统可用性降低 系统复杂度提高 一致性问题 4.MQ的使用条件 5.常见的MQ的产品 二.什么是Rab ...

  5. RabbitMQ入门教程——发布/订阅

    什么是发布订阅 发布订阅是一种设计模式定义了一对多的依赖关系,让多个订阅者对象同时监听某一个主题对象.这个主题对象在自身状态变化时,会通知所有的订阅者对象,使他们能够自动更新自己的状态. 为了描述这种 ...

  6. php写入rabbit速度,RabbitMQ 入门教程(PHP) 实现延迟功能

    php 使用rabbitmq-delayed-message-exchange插件实现延迟功能 1.安装 3.6.x下载地址 3.7.x下载地址 下载后解压,并将其拷贝至(使用Linux Debian ...

  7. RabbitMQ入门教程

    摘要: 使用RabbitMQ的消息队列,可以有效提高系统的峰值处理能力. RabbitMQ简介 RabbitMQ是消息代理(Message Broker),它支持多种异步消息处理方式,最常见的有: W ...

  8. RabbitMQ入门教程(十一):消息属性Properties

    分享一个朋友的人工智能教程.比较通俗易懂,风趣幽默,感兴趣的朋友可以去看看. 简介 发送消息可以为消息指定一些参数 Delivery mode: 是否持久化,1 - Non-persistent,2 ...

  9. RabbitMQ入门教程(四):工作队列(Work Queues)

    分享一个朋友的人工智能教程.比较通俗易懂,风趣幽默,感兴趣的朋友可以去看看. 工作队列 使用工作队列实现任务分发的功能,一个队列的优点就是很容易处理并行化的工作能力,但是如果我们积累了大量的工作,我们 ...

最新文章

  1. 微软推出Python入门课,登上GitHub趋势榜第一(附视频)
  2. Laravel5中Cookie的使用
  3. JS中集合对象(Array、Map、Set)及类数组对象的使用与对比
  4. vim删除文件第n行到结尾、或某段内容
  5. zookeeper的设计猜想-防止单点故障
  6. securecrt如何保存操作日志
  7. [收藏]用CSS构建iframe效果
  8. ckeditor 图片上传_开发问题:Django使用ckeditor上传到七牛云
  9. 【细节实现题】LeetCode 56. Merge Intervals
  10. vue 登录页面记住密码功能
  11. [Ubuntu] fg、bg让你的进程在前后台之间切换
  12. 分析下这个LC振荡电路图
  13. 入选司法部案例库,效率源协助的这起网络游戏外挂案到底“优”在何处?
  14. 修改最新版谷歌浏览器编码方式
  15. 所有大学都教Java,培训班也输出了大量Java程序员,为什么社会上的Java程序员还没有饱和?
  16. Hive开启WebUI
  17. 利用计算机制作3D动画属于,第一部完全以电脑技术制作而成的3D动画长片
  18. Joint Extraction of Entities and Relations Based on a Novel Tagging Scheme阅读总结
  19. css3动画属性菜鸟,CSS3 animation-timing-function 属性 | 菜鸟教程
  20. 微信小程序 如何实现列表

热门文章

  1. JSP Problem(第一次创建Web Project报错)
  2. java 深拷贝_java 深拷贝与浅拷贝机制详解
  3. python 乘法运算定律_计算机组成原理(上)资料
  4. 【必看】Linux 下的 TCP参数优化
  5. 基于函数计算的 BFF 架构
  6. Serverless 实战——使用 Rendertron 搭建 Headless Chrome 渲染解决方案
  7. 云原生生态周报 Vol. 15 | K8s 安全审计报告发布
  8. java for循环_愉快地学Java语言:第五章 循环
  9. linux磁盘阵列oravote,Oracle在Linux下集群RAC的安装与启停
  10. java质因数算法_Java分解任意输入数的质因数算法的实现示例