1、EasyNetQ组件的使用

EasyNetQ组件的使用方式比较简单,跟很多组件都类似,例如:建立连接,进行操作做等等,对于EasyNetQ组件也是如此。(mq的升级,用于简化rabbitmq应用代码)

在.NET中使用EasyNetQ,要求至少基于 .NET4.5的框架基础上进行开发,可以直接在VS项目上使用NuGet的程序包进行添加EasyNetQ的引用。

一般添加引用后,至少包含了下面图示的几个引用DLL。

2、相关概念

  • ConnectionFactory(连接工厂): 生产Connection的的工厂

  • Connection(连接):是RabbitMQ的socket的长链接,它封装了socket协议相关部分逻辑

  • Channel(频道|信道): 是建立在Connection连接之上的一种轻量级的连接,我们大部分的业务操作是在Channel这个接口中完成的,包括定义队列的声明queueDeclare、交换机的声明exchangeDeclare、队列的绑定queueBind、发布消息basicPublish、消费消息basicConsume等。如果把Connection比作一条光纤电缆的话,那么Channel信道就比作成光纤电缆中的其中一束光纤。一个Connection上可以创建任意数量的Channel。 

  • Producer(生产者):生产者用于发布消息

  • Exchange(交换机):生产者会将消息发送到交换机,然后交换机通过路由策略(规则)将消息路由到匹配的队列中去

  • Routing Key(路由键):一个String值,用于定义路由规则,在队列绑定的时候需要指定路由键,在生产者发布消息的时候需要指定路由键,当消息的路由键和队列绑定的路由键匹配时,消息就会发送到该队列。

  • Queue(队列):用于存储消息的容器,可以看成一个有序的数组,生产者生产的消息会发送到交换机中,最终交换机将消息存储到某个或某些队列中,队列可被消费者订阅,消费者从订阅的队列中获取消息。

  • Binding(绑定): Binding并不是一个概念,而是一种操作,RabbitMQ中通过绑定,以路由键作为桥梁将Exchange与Queue关联起来(Exchange—>Routing Key—>Queue),这样RabbitMQ就知道如何正确地将消息路由到指定的队列了,通过queueBind方法将Exchange、Routing Key、Queue绑定起来

  • Consumer(消费者):用于从队列中获取消息,消费者只需关注队列即可,不需要关注交换机和路由键,消费者可以通过basicConsume(订阅模式可以从队列中一直持续的自动的接收消息)或者basicGet(先订阅消息,然后获取单条消息,再然后取消订阅,也就是说basicGet一次只能获取一条消息,如果还想再获取下一条还要再次调用basicGet)来从队列中获取消息

  • vhost(虚拟主机): RabbitMQ 通过虚拟主机(virtual host)来分发消息, 拥有自己独立的权限控制,不同的vhost之间是隔离的,单独的。vhost是权限控制的基本单位,用户只能访问与之绑定的vhost,默认vhost:”/” ,默认用户”guest” 密码“guest”,来访问默认的vhost。

下图说明了生产者将消息发送到交换机中,然后又路由到指定的队列中 

3、分发与订阅使用

4、代码编写
为了测试发布和订阅消息,我们可以建立几个不同的项目来进行测试,如发布放在一个Winform项目,订阅放在一个Winform项目,另外一个项目放置共享的消息对象定义,如下所示。
Producter 使用

1)发送消息代码:

  1. /// <summary>
  2.  /// 连接配置
  3.  /// </summary>
  4.  private static readonly ConnectionFactory rabbitMqFactory = new ConnectionFactory(){
  5.  HostName ="192.168.1.8",UserName="hao",Password="abc123",Port= 5672
  6.  };
  7. /// <summary>
  8. /// 路由名称
  9. /// </summary>
  10. const string TopExchangeName = "topic.justin.exchange";
  11. //队列名称
  12. const string TopQueueName = "topic.justin.queue";
  13. public static void TopicExchangeSendMsg()
  14.  {
  15. using (IConnection conn = rabbitMqFactory.CreateConnection())
  16.  {
  17. using (IModel channel = conn.CreateModel())
  18.  {
  19.  channel.ExchangeDeclare(TopExchangeName, "topic", durable: false, autoDelete: false, arguments: null);
  20.  channel.QueueDeclare(TopQueueName, durable: false, autoDelete: false, exclusive: false, arguments: null);
  21.  channel.QueueBind(TopQueueName, TopExchangeName, routingKey: TopQueueName);
  22. //var props = channel.CreateBasicProperties();
  23. //props.Persistent = true;
  24. string vadata = Console.ReadLine();
  25. while (vadata != "exit")
  26.  {
  27. var msgBody = Encoding.UTF8.GetBytes(vadata);
  28.  channel.BasicPublish(exchange: TopExchangeName, routingKey: TopQueueName, basicProperties: null, body: msgBody);
  29.  Console.WriteLine(string.Format("***发送时间:{0},发送完成,输入exit退出消息发送", DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss")));
  30.  vadata = Console.ReadLine();
  31.  }
  32.  }
  33.  }
  34.  }

2)测试验证(登入rabbitmq服务器)

Customer

1)接收消息代码:

  1.  /// <summary>
  2.  /// 连接配置
  3.  /// </summary>
  4.  private static readonly ConnectionFactory rabbitMqFactory = new ConnectionFactory() {
  5.  HostName = "192.168.1.8", UserName = "hao", Password = "abc123", Port = 5672
  6.  };
  7.   
  8.  /// <summary>
  9.  /// 路由名称
  10.  /// </summary>
  11.  const string TopExchangeName = "topic.justin.exchange";
  12.   
  13.  //队列名称
  14.  const string TopQueueName = "topic.justin.queue";
  15.   
  16.  public static void TopicAcceptExchange()
  17.  {
  18.  using (IConnection conn = rabbitMqFactory.CreateConnection())
  19.  {
  20.  using (IModel channel = conn.CreateModel())
  21.  {
  22.  channel.ExchangeDeclare(TopExchangeName, "topic", durable: false, autoDelete: false, arguments: null);
  23.  channel.QueueDeclare(TopQueueName, durable: false, autoDelete: false, exclusive: false, arguments: null);
  24.  channel.BasicQos(prefetchSize: 0, prefetchCount: 1, global: false);
  25.  channel.QueueBind(TopQueueName, TopExchangeName, routingKey: TopQueueName);
  26.  var consumer = new EventingBasicConsumer(channel);
  27.  consumer.Received += (model, ea) =>
  28.  {
  29.  var msgBody = Encoding.UTF8.GetString(ea.Body);
  30.  Console.WriteLine(string.Format("***接收时间:{0},消息内容:{1}", DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss"), msgBody));
  31.  int dots = msgBody.Split('.').Length - 1;
  32.  System.Threading.Thread.Sleep(dots * 1000);
  33.  Console.WriteLine(" [x] Done");
  34.  channel.BasicAck(deliveryTag: ea.DeliveryTag, multiple: false);
  35.  };
  36.  channel.BasicConsume(TopQueueName, noAck: false, consumer: consumer);
  37.   
  38.  Console.WriteLine("按任意值,退出程序");
  39.  Console.ReadKey();
  40.  } 
  41. }
  42.  }

2)查看queue中的messages字段情况

参考资料:https://cloud.tencent.com/developer/article/1151202

.net api应用资料:

http://www.rabbitmq.com/dotnet-api-guide.html#recovery  ;

https://tw.wxwenku.com/d/101521853  ;

https://blog.csdn.net/WuLex/article/details/62043912;https://www.codeproject.com/Articles/309786/Rabbit-Mq-Shovel-Example  ;

RabbitMQ---3、c#实现的更多相关文章

  1. 消息队列——RabbitMQ学习笔记

    消息队列--RabbitMQ学习笔记 1. 写在前面 昨天简单学习了一个消息队列项目--RabbitMQ,今天趁热打铁,将学到的东西记录下来. 学习的资料主要是官网给出的6个基本的消息发送/接收模型, ...

  2. RabbitMq应用二

    在应用一中,基本的消息队列使用已经完成了,在实际项目中,一定会出现各种各样的需求和问题,rabbitmq内置的很多强大机制和功能会帮助我们解决很多的问题,下面就一个一个的一起学习一下. 消息响应机制 ...

  3. 如何优雅的使用RabbitMQ

    RabbitMQ无疑是目前最流行的消息队列之一,对各种语言环境的支持也很丰富,作为一个.NET developer有必要学习和了解这一工具.消息队列的使用场景大概有3种: 1.系统集成,分布式系统的设 ...

  4. RabbitMq应用一的补充(RabbitMQ的应用场景)

    直接进入正题. 一.异步处理 场景:发送手机验证码,邮件 传统古老处理方式如下图 这个流程,全部在主线程完成,注册->入库->发送邮件->发送短信,由于都在主线程,所以要等待每一步完 ...

  5. RabbitMq应用一

    RabbitMq应用一 RabbitMQ的具体概念,百度百科一下,我这里说一下我的理解,如果有少或者不对的地方,欢迎纠正和补充. 一个项目架构,小的时候,一般都是传统的单一网站系统,或者项目,三层架构 ...

  6. 缓存、队列(Memcached、redis、RabbitMQ)

    本章内容: Memcached 简介.安装.使用 Python 操作 Memcached 天生支持集群 redis 简介.安装.使用.实例 Python 操作 Redis String.Hash.Li ...

  7. 消息队列性能对比——ActiveMQ、RabbitMQ与ZeroMQ(译文)

    Dissecting Message Queues 概述: 我花了一些时间解剖各种库执行分布式消息.在这个分析中,我看了几个不同的方面,包括API特性,易于部署和维护,以及性能质量..消息队列已经被分 ...

  8. windows下 安装 rabbitMQ 及操作常用命令

    rabbitMQ是一个在AMQP协议标准基础上完整的,可服用的企业消息系统.它遵循Mozilla Public License开源协议,采用 Erlang 实现的工业级的消息队列(MQ)服务器,Rab ...

  9. RabbitMQ + PHP (三)案例演示

    今天用一个简单的案例来实现 RabbitMQ + PHP 这个消息队列的运行机制. 主要分为两个部分: 第一:发送者(publisher) 第二:消费者(consumer) (一)生产者 (创建一个r ...

  10. RabbitMQ + PHP (二)AMQP拓展安装

    上篇说到了 RabbitMQ 的安装. 这次要在讲案例之前,需要安装PHP的AMQP扩展.不然可能会报以下两个错误. 1.Fatal error: Class 'AMQPConnection' not ...

随机推荐

  1. dynamic的一些使用心得

    dynamic关键字才出来的时候,觉得真是没什么用,谁总是和com交互来交互去啊,唯恐避之不及啊. 后来逐渐算是有了一些使用心得,发现这货还真是犀利啊,故在此举几个例子,起抛砖引玉之用. 1.替代XX ...

  2. ClamAV学习【1】——ClamAV流程

    不知道是对还是错,一开始就上手学习ClamAV,享受被虐的过程吧. 发现ClamAV的官网也很少资料,搜商还有待加强,大概翻阅了example的源代码,明白了其查毒的大概方式(BM和AC算法匹配特征码 ...

  3. G - 確率(水题)

    原文链接 G - 確率 Time Limit:1000MS     Memory Limit:131072KB     64bit IO Format:%lld & %llu Submit S ...

  4. “全栈2019”Java第九十二章:外部类与内部类成员覆盖详解

    难度 初级 学习时间 10分钟 适合人群 零基础 开发语言 Java 开发环境 JDK v11 IntelliJ IDEA v2018.3 文章原文链接 "全栈2019"Java第 ...

  5. 苹果笔记本调整 pycharm 字体大小的地方

    我想,对于习惯了使用windows版本 或者 乌班图版本 的pycharm 的人而言, mac版本调节字体的地方藏的实在是太坑爹了.

  6. robot framework接口测试之一-完整的测试用例

    *** Settings *** Library Collections Library json Library requests Library RequestsLibrary Library H ...

  7. ELK安装成windows服务

    一.Elasticsearch安装成windows服务 我的es所在路径为:D:\ELK5.5.0\elasticsearch-5.5.0 Java 安装目录为:C:\Program Files\Ja ...

  8. Win10桌面图标无法拖动

    1.右键桌面>查看>取消自动排列 2.桌面多按几次Esc 3.gpedit.msc  “用户配置/管理模板/Windows组件/任务计划程序/禁止拖放>改为未配置

  9. numpy 模块常用方法

    Numpy是科学计算库,是一个强大的N维数组对象ndarray,是广播功能函数.其整合C/C++.fortran代码的工具 ,更是Scipy.Pandas等的基础 .ndim :维度 .shape : ...

  10. 聊聊Postgres中的IPC之SI Message Queue

    在 PostgreSQL中,每一个进程都有属于自己的共享缓存(shared cache).例如,同一个系统表在不同的进程中都有对应的Cache来缓存它的元组(对于RelCache来说缓存的是一个Rel ...