RabbitMQ与.net core(二)Producer与Exchange
Producer:消息的生产者,也就是创建消息的对象
Exchange:消息的接受者,也就是用来接收消息的对象,Exchange接收到消息后将消息按照规则发送到与他绑定的Queue中。下面我们来定义一个Producer与Exchange。
1.新建.netcore console项目,并引入RabbitMQ.Client的Nuget包
2.创建Exchange
- using RabbitMQ.Client;
- namespace RabbitMQConsole
- {
- class Program
- {
- static void Main(string[] args)
- {
- ConnectionFactory factory = new ConnectionFactory();
- factory.HostName = "39.**.**.**";
- factory.Port = ;
- factory.VirtualHost = "/";
- factory.UserName = "root";
- factory.Password = "root";
- var exchange = "change2";
- var route = "route2";
- var queue = "queue2";
- using (var connection = factory.CreateConnection())
- {
- using (var channel = connection.CreateModel())
- {
- channel.ExchangeDeclare(exchange, type:"direct", durable: true, autoDelete: false); //创建Exchange
- }
- }
- }
- }
- }
可以看到Echange的参数有:
type:可选项为,fanout,direct,topic,headers。区别如下:
fanout:发送到所有与当前Exchange绑定的Queue中
direct:发送到与消息的routeKey相同的Rueue中
topic:fanout的模糊版本
headers:发送到与消息的header属性相同的Queue中
durable:持久化
autoDelete:当最后一个绑定(队列或者exchange)被unbind之后,该exchange自动被删除。
运行程序,可以在可视化界面看到change2
接下来我们可以创建与change2绑定的queue
3.创建Queue
- using (var channel = connection.CreateModel())
- {
- channel.ExchangeDeclare(exchange, type: "direct", durable: true, autoDelete: false);
- channel.QueueDeclare(queue, durable: true, exclusive: false, autoDelete: false); #创建queue2
- channel.QueueBind(queue, exchange, route); #将queue2绑定到exchange2
- }
可以看到Echange的参数有:
durable:持久化
exclusive:如果为true,则queue只在channel存在时存在,channel关闭则queue消失
autoDelete:当最后一个绑定(队列或者exchange)被unbind之后,该exchange自动被删除。
去可视化界面看Queue
4.发送消息
- using (var channel = connection.CreateModel())
- {
- channel.ExchangeDeclare(exchange, type: "direct", durable: true, autoDelete: false);
- channel.QueueDeclare(queue, durable: true, exclusive: false, autoDelete: false);
- channel.QueueBind(queue, exchange, route);
- var props = channel.CreateBasicProperties();
- props.Persistent = true; #持久化
- channel.BasicPublish(exchange, route, true, props, Encoding.UTF8.GetBytes("hello rabbit"));
- }
5.消费消息
- using RabbitMQ.Client;
- using System;
- using System.Text;
- namespace RabbitMQClient
- {
- class Program
- {
- private static readonly ConnectionFactory rabbitMqFactory = new ConnectionFactory()
- {
- HostName = "39.**.**.**",
- Port = ,
- UserName = "root",
- Password = "root",
- VirtualHost = "/"
- };
- static void Main(string[] args)
- {
- var exchange = "change2";
- var route = "route2";
- var queue = "queue2";
- using (IConnection conn = rabbitMqFactory.CreateConnection())
- using (IModel channel = conn.CreateModel())
- {
- channel.ExchangeDeclare(exchange, "direct", durable: true, autoDelete: false);
- channel.QueueDeclare(queue, durable: true, exclusive: false, autoDelete: false);
- channel.QueueBind(queue, exchange, route);
- while (true)
- {
- var message = channel.BasicGet(queue, true); #第二个参数说明自动释放消息,如为false需手动释放消息
- if(message!=null)
- {
- var msgBody = Encoding.UTF8.GetString(message.Body);
- Console.WriteLine(string.Format("***接收时间:{0},消息内容:{1}", DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss"), msgBody));
- }
- System.Threading.Thread.Sleep(TimeSpan.FromSeconds());
- }
- }
- }
- }
- }
运行查看结果
查看可视化界面
6.手动释放消息
- while (true)
- {
- var message = channel.BasicGet(queue, false);#设置为手动释放
- if(message!=null)
- {
- var msgBody = Encoding.UTF8.GetString(message.Body);
- Console.WriteLine(string.Format("***接收时间:{0},消息内容:{1}", DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss"), msgBody));
- }
- channel.BasicAck(message.DeliveryTag, false); #手动释放
- System.Threading.Thread.Sleep(TimeSpan.FromSeconds());
- }
我们再发一条消息,然后开始消费,加个断点调试一下
查看一下Queue中消息状态
然后直接取消调试,不让程序走到释放的那一步,再查看一下消息状态
这么说来只要不走到 channel.BasicAck(message.DeliveryTag, false);这一行,消息就不会被释放掉,我们让程序直接走到这一行代码,查看一下消息的状态
如图已经被释放了
7.让失败的消息回到队列中
- while (true)
- {
- var message = channel.BasicGet(queue, false);
- if(message!=null)
- {
- var msgBody = Encoding.UTF8.GetString(message.Body);
- Console.WriteLine(string.Format("***接收时间:{0},消息内容:{1}", DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss"), msgBody));
- Console.WriteLine(message.DeliveryTag); #当前消息被处理的次序数
- if (==)
- channel.BasicReject(message.DeliveryTag, true);
- }
- System.Threading.Thread.Sleep(TimeSpan.FromSeconds());
- }
重新发送4条消息
开始消费
我们可以看到消息一直没有没消费,因为消息被处理之后又放到了队尾
8.监听消息
- using (IConnection conn = rabbitMqFactory.CreateConnection())
- using (IModel channel = conn.CreateModel())
- {
- channel.ExchangeDeclare(exchange, "direct", durable: true, autoDelete: false);
- channel.QueueDeclare(queue, durable: true, exclusive: false, autoDelete: false);
- channel.QueueBind(queue, exchange, route);
- channel.BasicQos(prefetchSize: , prefetchCount: 1, global: false); #一次接受10条消息,否则rabbit会把所有的消息一次性推到client,会增大client的负荷
- EventingBasicConsumer consumer = new EventingBasicConsumer(channel);
- consumer.Received += (model, ea) =>
- {
- Byte[] body = ea.Body;
- String message = Encoding.UTF8.GetString(body);
- Console.WriteLine( message+Thread.CurrentThread.ManagedThreadId);
- channel.BasicAck(deliveryTag: ea.DeliveryTag, multiple: false);
- };
- channel.BasicConsume(queue: queue, autoAck: false, consumer: consumer);
- Console.ReadLine();
- }
RabbitMQ与.net core(二)Producer与Exchange的更多相关文章
- ExpandoObject与DynamicObject的使用 RabbitMQ与.net core(一)安装 RabbitMQ与.net core(二)Producer与Exchange ASP.NET Core 2.1 : 十五.图解路由(2.1 or earler) .NET Core中的一个接口多种实现的依赖注入与动态选择看这篇就够了
ExpandoObject与DynamicObject的使用 using ImpromptuInterface; using System; using System.Dynamic; names ...
- RabbitMQ与.net core(三) fanout类型Exchange 与 消息的过期时间 与 队列的存活时间
上一篇我们讲了关于direct类型的Exchange,这一片我们来了解一下fanout类型的Exchange. 1.Exchange的fanout类型 fanout类型的Exchange的特点是会把消 ...
- 如何从40亿整数中找到不存在的一个 webservice Asp.Net Core 轻松学-10分钟使用EFCore连接MSSQL数据库 WPF实战案例-打印 RabbitMQ与.net core(五) topic类型 与 headers类型 的Exchange
如何从40亿整数中找到不存在的一个 前言 给定一个最多包含40亿个随机排列的32位的顺序整数的顺序文件,找出一个不在文件中的32位整数.(在文件中至少确实一个这样的数-为什么?).在具有足够内存的情况 ...
- RabbitMQ入门教程(十二):消息确认Ack
原文:RabbitMQ入门教程(十二):消息确认Ack 版权声明:本文为博主原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明. 本文链接:https://blog.csd ...
- RabbitMQ消息队列(二)-RabbitMQ消息队列架构与基本概念
没错我还是没有讲怎么安装和写一个HelloWord,不过快了,这一章我们先了解下RabbitMQ的基本概念. RabbitMQ架构 说是架构其实更像是应用场景下的架构(自己画的有点丑,勿嫌弃) 从图中 ...
- RabbitMQ系列教程之二:工作队列(Work Queues)(转载)
RabbitMQ系列教程之二:工作队列(Work Queues) 今天开始RabbitMQ教程的第二讲,废话不多说,直接进入话题. (使用.NET 客户端 进行事例演示) ...
- RabbitMQ基本概念(二)-RabbitMQ消息队列架构与基本概念
没错我还是没有讲怎么安装和写一个HelloWord,不过快了,这一章我们先了解下RabbitMQ的基本概念. RabbitMQ架构 说是架构其实更像是应用场景下的架构(自己画的有点丑,勿嫌弃) 从图中 ...
- Docker + .NET Core(二)
原文:Docker + .NET Core(二) 前言: 环境:centos7.5 64 位 正文: 首先我们在宿主机上安装 .NET Core SDK sudo rpm --import https ...
- RabbitMQ的使用(二)- RabbitMQ服务在单机中做集群
RabbitMQ的使用(二)- RabbitMQ服务在单机中做集群 作者:markjiang7m2 原文地址:https://www.cnblogs.com/markjiang7m2/p/128371 ...
随机推荐
- Informatica 常用组件Lookup缓存之一 概述
可以配置查找转换以高速缓存查找表.PowerCenter 将在处理高速缓存查找转换中的第一个数据行时在存储器中建立高速缓存.它将根据您在转换或会话特性中配置的数量来分配高速缓存区内存.PowerCen ...
- 第二十章 springboot + consul(1)
consul的具体安装与操作查看博客的consul系列. 一.启动consul (1个server+1个client,方便起见,client使用本机):查看:http://www.cnblogs.co ...
- 关于asp.net页面缓存
1,ASPX页面缓存 页面缓存的使用方法非常的简单,只需要在aspx页的顶部加一句声明<%@ OutputCache Duration="60" VaryByParam=&q ...
- Partition List leetcode java
题目: Given a linked list and a value x, partition it such that all nodes less than x come before node ...
- Java基础(十二):包(package)
一.Java 包(package): 为了更好地组织类,Java 提供了包机制,用于区别类名的命名空间.包的作用: 1.把功能相似或相关的类或接口组织在同一个包中,方便类的查找和使用. 2.如同文件夹 ...
- IOS开发之新浪微博OAuth2
说明:微博开放接口的调用,如发微博.关注等,都是需要获取用户身份认证的.目前微博开放平台用户身份鉴权主要采用的是OAuth2.0.为了方便开发者开发.测试自己的应用. OAuth2.0较1.0相比,整 ...
- 如何在Linux上面安装GCC 4.1.2
安装步骤: 1.首先下载GCC 4.1.2的source code package: $ wget http://mirrors.ustc.edu.cn/gnu/gcc/gcc-4.1.2/gcc-4 ...
- The Info-Button Standard: Bring Meaningful Use To the Patient
http://thehealthcareblog.com/blog/2010/01/28/the-info-button-standard-bringing-meaningful-use-to-the ...
- 空格在Html中的表示方法( 含义)
转自:http://www.cnblogs.com/hailexuexi/archive/2010/07/25/1784611.html 在web开发经常会遇到如: 这样的字符.它其实是Html将 ...
- [android错误] Failed to install *.apk on device 'emulator-5554': timeout
[2014-06-26 15:35:42 - app] ------------------------------ [2014-06-26 15:35:42 - app] Android Launc ...