windows环境安装:
https://www.cnblogs.com/ericli-ericli/p/5902270.html
.NET Core 使用RabbitMQ
https://www.cnblogs.com/stulzq/p/7551819.html

安装

"C:\Program Files\RabbitMQ Server\rabbitmq_server-3.7.9\sbin\rabbitmq-plugins.bat" enable rabbitmq_management

net stop RabbitMQ && net start RabbitMQ

创建用户,密码,绑定角色

查看已有用户及用户的角色:
rabbitmqctl.bat list_users

新增一个用户:
rabbitmqctl.bat add_user username password
示例:
rabbitmqctl.bat add_user tangsansan 123456

rabbitmqctl.bat set_user_tags username administrator

示例:
rabbitmqctl.bat set_user_tags tangsansan administrator

基本用法

引入:RabbitMQ.Client

消费者

           //创建连接工厂var factory = new ConnectionFactory(){UserName = "tangsansan",//用户名Password = "123456",//密码HostName = "localhost"//rabbitmq ip};//创建连接var connection = factory.CreateConnection();//创建通道var channel = connection.CreateModel();//定义一个队列channel.QueueDeclare("hello", false, false, false, null);Console.WriteLine("\nRabbitMQ连接成功,请输入消息,输入exit退出!");string input;do{input = Console.ReadLine();var sendBytes = Encoding.UTF8.GetBytes(input);//发布消息channel.BasicPublish("", "hello", null, sendBytes);} while (input.Trim().ToLower() != "exit");channel.Close();connection.Close();

生产者

 //创建连接工厂var factory = new ConnectionFactory(){UserName = "tangsansan",//用户名Password = "123456",//密码HostName = "localhost"//rabbitmq ip};//创建连接var connection = factory.CreateConnection();//创建通道var channel = connection.CreateModel();//定义一个队列channel.QueueDeclare("hello", false, false, false, null);Console.WriteLine("\nRabbitMQ连接成功,请输入消息,输入exit退出!");string input;do{input = Console.ReadLine();var sendBytes = Encoding.UTF8.GetBytes(input);//发布消息channel.BasicPublish("", "hello", null, sendBytes);} while (input.Trim().ToLower() != "exit");channel.Close();connection.Close();

启动了一个生产者,两个消费者,可以看见两个消费者都能收到消息,消息投递到哪个消费者是由RabbitMQ决定的。

RabbitMQ消费失败的处理

RabbitMQ采用消息应答机制,即消费者收到一个消息之后,需要发送一个应答,然后RabbitMQ才会将这个消息从队列中删除,如果消费者在消费过程中出现异常,断开连接切没有发送应答,那么RabbitMQ会将这个消息重新投递

//接收到消息事件
consumer.Received += (ch, ea) =>
{var message = Encoding.UTF8.GetString(ea.Body);Console.WriteLine($"收到消息: {message}");Console.WriteLine($"收到该消息[{ea.DeliveryTag}] 延迟10s发送回执");Thread.Sleep(10000);//确认该消息已被消费channel.BasicAck(ea.DeliveryTag, false);Console.WriteLine($"已发送回执[{ea.DeliveryTag}]");
};

使用RabbitMQ的Exchange

前面我们可以看到生产者将消息投递到Queue中,实际上这在RabbitMQ中这种事情永远都不会发生。实际的情况是,生产者将消息发送到Exchange(交换器),由Exchange将消息路由到一个或多个Queue中(或者丢弃)

Direct Exchange

            string exchangeName = "TestChange";string queueName = "hello";string routeKey = "helloRouteKey";//创建连接工厂var factory = new ConnectionFactory(){UserName = "tangsansan",//用户名Password = "123456",//密码HostName = "localhost"//rabbitmq ip};//创建连接var connection = factory.CreateConnection();//创建通道var channel = connection.CreateModel();//定义一个Direct类型交换机channel.ExchangeDeclare(exchangeName, ExchangeType.Direct, false, false, null);//定义一个队列channel.QueueDeclare(queueName, false, false, false, null);//将队列绑定到交换机channel.QueueBind(queueName, exchangeName, routeKey, null);Console.WriteLine($"\nRabbitMQ连接成功,Exchange:{exchangeName},Queue:{queueName},Route:{routeKey},\n\n请输入消息,输入exit退出!");string input;do{input = Console.ReadLine();var sendBytes = Encoding.UTF8.GetBytes(input);//发布消息channel.BasicPublish(exchangeName, routeKey, null, sendBytes);} while (input.Trim().ToLower() != "exit");channel.Close();connection.Close();

Fanout Exchange


所有发送到Fanout Exchange的消息都会被转发到与该Exchange 绑定(Binding)的所有Queue上。

Fanout Exchange 不需要处理RouteKey 。只需要简单的将队列绑定到exchange 上。这样发送到exchange的消息都会被转发到与该交换机绑定的所有队列上。类似子网广播,每台子网内的主机都获得了一份复制的消息。

所以,Fanout Exchange 转发消息是最快的。

static void Main(string[] args){string exchangeName = "TestFanoutChange";string queueName1 = "hello1";string queueName2 = "hello";string routeKey = "";//创建连接工厂ConnectionFactory factory = new ConnectionFactory{UserName = "tangsansan",//用户名Password = "123456",//密码HostName = "localhost"//rabbitmq ip};//创建连接var connection = factory.CreateConnection();//创建通道var channel = connection.CreateModel();//定义一个Direct类型交换机channel.ExchangeDeclare(exchangeName, ExchangeType.Fanout, false, false, null);//定义队列1channel.QueueDeclare(queueName1, false, false, false, null);//定义队列2channel.QueueDeclare(queueName2, false, false, false, null);//将队列绑定到交换机channel.QueueBind(queueName1, exchangeName, routeKey, null);channel.QueueBind(queueName2, exchangeName, routeKey, null);//生成两个队列的消费者ConsumerGenerator(queueName1);ConsumerGenerator(queueName2);Console.WriteLine($"\nRabbitMQ连接成功,\n\n请输入消息,输入exit退出!");string input;do{input = Console.ReadLine();var sendBytes = Encoding.UTF8.GetBytes(input);//发布消息channel.BasicPublish(exchangeName, routeKey, null, sendBytes);} while (input.Trim().ToLower() != "exit");channel.Close();connection.Close();}/// <summary>/// 根据队列名称生成消费者/// </summary>/// <param name="queueName"></param>static void ConsumerGenerator(string queueName){//创建连接工厂ConnectionFactory factory = new ConnectionFactory{UserName = "tangsansan",//用户名Password = "123456",//密码HostName = "localhost"//rabbitmq ip};//创建连接var connection = factory.CreateConnection();//创建通道var channel = connection.CreateModel();//事件基本消费者EventingBasicConsumer consumer = new EventingBasicConsumer(channel);//接收到消息事件consumer.Received += (ch, ea) =>{var message = Encoding.UTF8.GetString(ea.Body);Console.WriteLine($"Queue:{queueName}收到消息: {message}");//确认该消息已被消费channel.BasicAck(ea.DeliveryTag, false);};//启动消费者 设置为手动应答消息channel.BasicConsume(queueName, false, consumer);Console.WriteLine($"Queue:{queueName},消费者已启动");}

Topic Exchange


所有发送到Topic Exchange的消息被转发到能和Topic匹配的Queue上,

Exchange 将路由进行模糊匹配。可以使用通配符进行模糊匹配,符号“#”匹配一个或多个词,符号“”匹配不多不少一个词。因此“XiaoChen.#”能够匹配到“XiaoChen.pets.cat”,但是“XiaoChen.” 只会匹配到“XiaoChen.money”。

所以,Topic Exchange 使用非常灵活。

      static void Main(string[] args){string exchangeName = "TestTopicChange";string queueName = "hello";string routeKey = "TestRouteKey.*";//创建连接工厂ConnectionFactory factory = new ConnectionFactory{UserName = "tangsansan",//用户名Password = "123456",//密码HostName = "localhost"//rabbitmq ip};//创建连接var connection = factory.CreateConnection();//创建通道var channel = connection.CreateModel();//定义一个Direct类型交换机channel.ExchangeDeclare(exchangeName, ExchangeType.Topic, false, false, null);//定义队列1channel.QueueDeclare(queueName, false, false, false, null);//将队列绑定到交换机channel.QueueBind(queueName, exchangeName, routeKey, null);Console.WriteLine($"\nRabbitMQ连接成功,\n\n请输入消息,输入exit退出!");string input;do{input = Console.ReadLine();var sendBytes = Encoding.UTF8.GetBytes(input);//发布消息channel.BasicPublish(exchangeName, "TestRouteKey.one", null, sendBytes);} while (input.Trim().ToLower() != "exit");channel.Close();connection.Close();}

问题:

None of the specified endpoints were reachable

这个异常在创建连接时抛出(CreateConnection()),原因一般是ConnectionFactory参数设置不对,比如HostName、UserName、Password
未设置VirtualHost的权限
设置方法:RabbitmqWeb管理网站-->Admin

net core 使用 rabbitmq相关推荐

  1. .NET Core 使用RabbitMQ

    RabbitMQ简介 AMQP,即Advanced Message Queuing Protocol,高级消息队列协议,是应用层协议的一个开放标准,为面向消息的中间件设计.消息中间件主要用于组件之间的 ...

  2. .Net Core 集成 RabbitMQ 订阅与发送

    什么是RabbitMQ? 专业理解: MQ全称为Message Queue,即消息队列, RabbitMQ是由erlang语言开发,基于AMQP(Advanced MessageQueue 高级消息队 ...

  3. .NET Core微服务之基于EasyNetQ使用RabbitMQ消息队列

    Tip: 此篇已加入.NET Core微服务基础系列文章索引 一.消息队列与RabbitMQ 1.1 消息队列 "消息"是在两台计算机间传送的数据单位.消息可以非常简单,例如只包含 ...

  4. 消息队列,我只选RabbitMQ!

    高并发架构是架构师的必修课,而消息队列,则是王冠上最闪亮的那颗明珠!能否驾驭消息队列这款高并发神器,亦成为架构师的试金石.作为专注.NET领域十多年的老架构师,下面从队列本质.技术选型.实战应用三个方 ...

  5. RabbitMQ教程C#版 - 工作队列

    先决条件 本教程假定RabbitMQ已经安装,并运行在localhost标准端口(5672).如果你使用不同的主机.端口或证书,则需要调整连接设置. 从哪里获得帮助 如果您在阅读本教程时遇到困难,可以 ...

  6. RabbitMQ教程C#版 “Hello World”

    先决条件 本教程假定RabbitMQ已经安装,并运行在localhost标准端口(5672).如果你使用不同的主机.端口或证书,则需要调整连接设置. 从哪里获得帮助 如果您在阅读本教程时遇到困难,可以 ...

  7. .NET CoreWebApi基于EasyNetQ使用RabbitMQ消息队列

    一.消息队列与RabbitMQ 1.1 消息队列 "消息"是在两台计算机间传送的数据单位.消息可以非常简单,例如只包含文本字符串:也可以更复杂,可能包含嵌入对象.消息被发送到队列中 ...

  8. 机票预定系统类图_电商系统延时任务机制源码分享

    需求分析: 在javashop电商系统中,各种促销活动都有开始时间和结束时间,想要让一个活动在预定的时间开始或结束,使用定时任务轮询,存在耗性能并且不能在准确的时间点开始或结束的缺点,为了可以在指定的 ...

  9. 北京Dotnet分享会 || 精英论坛第三期

    编者按: 没有一成不变的定律,没有长久不衰的流行,更没有一劳永逸的侥幸, 只有自己刻苦努力.脚踏实地.兢兢业业的学习和工作, 才会成为这个社会永远不会被淘汰的中流砥柱. 一.昨夜西风凋碧树 昨夜西风凋 ...

最新文章

  1. [Manthan, Codefest 18][Codeforces 1037E. Trips]
  2. 书评 | 如何让开发中的各种文档变活?《活文档》阅读总结
  3. python朋友圈为什么这么火-火爆朋友圈的Python入门教程,终于有人把它整理成手册了...
  4. Python计算机视觉:安装
  5. rmi 反序列化漏洞_IDEA动态调试(二)——反序列化漏洞(Fastjson)
  6. php视频流传输,视频流传输协议RTP/RTCP/RTSP/HTTP的区别
  7. powershell 开发入门_详谈Ubuntu PowerShell(小白入门必看教程)
  8. Tomacat乱码解决
  9. 知乎高赞:什么样的学生最坑导师?
  10. centos 安装jenkins
  11. linux发邮件权限,Linux通过命令行发邮件的步骤
  12. SQLyog 激活 注册码
  13. 关于飞信的协议以及验证码
  14. 什么是微信公众平台、微信开放平台?它们之间又有什么区别?
  15. sqlite读写锁和线程模式
  16. vue项目每次更新后清除浏览器缓存
  17. 超详细总结:python的转义字符及用法
  18. acfun怎么下载视频
  19. VirtualBox虚拟机的网卡地址重复导致的问题
  20. LeetCode 491 递增子序列

热门文章

  1. 谷歌发布TensorFlow,用于测试人工智能模型的隐私保护
  2. 如何设置采购收货直接转到供应商库存?
  3. 2020 年最具潜力 44 个顶级开源项目,涵盖 11 类 AI 学习框架、平台(值得收藏)
  4. 机器学习 | 强化学习,解决决策问题的行家(上)
  5. 2019年1月份A项目面试纪要
  6. 【机器学习-学习笔记】单/多变量线性回归、多项式回归、逻辑回归、过拟合、正则化
  7. 《数学之美》第12章 有限状态机—地图与本地搜索的核心技术
  8. 人工智能克服了类脑硬件的绊脚石
  9. OpenAI雄心勃勃的机器人计划失败了:强化学习没法用?
  10. 神经网络原来是这样和数学挂钩的