一、RabbitMQ几个对象介绍
通过web管理界面截图可以看到:Connections、Channels、Exchanges、Queues、Admin
1、Connections:连接RabbitMQ客户端
2、Channels :通道,相当一个数据库的DB实例
3、Exchanges:消息中枢,负责将发布的消息按照一定的规则放到对应队列中。
4、Queues:队列,消费者从中获取消息
5、Admin: 用户
二、对象详细介绍
1、Connections
//创建连接工厂
ConnectionFactory factory = new ConnectionFactory
{
UserName = "admin",//用户名
Password = "admin",//密码
VirtualHost = "my_vhost",
HostName = "ip"//rabbitmq ip
//端口默认为5672,如果端口没做特殊处理,可以不填写
};
//创建连接
var connection = factory.CreateConnection();
2、Channels
//创建通道
var channel = connection.CreateModel();
3、Exchanges
//创建交换机:消息中枢
channel.ExchangeDeclare("exchangeName", ExchangeType.Direct, false, false, null);
4、Queues
//声明一个队列
channel.QueueDeclare("hello", false, false, false, null);
//队列绑定一个消息中枢,以便消息中枢可以按照逻辑可以往队列中推送消息
channel.QueueBind("hello", "exchangeName", "routeKey", null);
注意:消息中枢Exchange 往Queues推送消息有四种模式
1、ExchangeType.Direct、Fanout 、Topic 、Headers:Exchange绑定Queues时设置的路由和发布
假设:
Exchange绑定Queues时路由名称为 “routeA”
发布消息时设置路由为 “routeB”
发布消息
channel.BasicPublish("exchangeName", "hello", null, sendBytes);
推送模式:
ExchangeType.Direct :routeA必须和routeB相等,exchange才能推送到队列里面(记得队列和exchange要绑定哦)
**ExchangeType.Fanout:**忽略路由设置,只要有绑定关系,都推送
ExchangeType.Topic : 可以设置模糊匹配,“#”匹配一个或多个词,“*”匹配不多不少一个词
ExchangeType.Headers:发布消息时通过var properties = channel.CreateBasicProperties();创建基本属性,设置properties 的header字典键值对;消费消息时再创建queue和exchange并且绑定exchange和queue,绑定时传入对于的字典键值对。
三、消费消息
消费时和exchange没有关系,只和队列有关系
//创建连接工厂
ConnectionFactory factory = new ConnectionFactory
{
UserName = "admin",//用户名
Password = "admin",//密码
VirtualHost = "my_vhost",
HostName = "47.100.65.100"//rabbitmq ip
};
//创建连接
var connection = factory.CreateConnection();
//创建通道
var channel = connection.CreateModel();
//事件基本消费者
EventingBasicConsumer consumer = new EventingBasicConsumer(channel);
//定义接收到消息事件 须要调用 channel.BasicConsume 才会执行此事件
consumer.Received += (ch, ea) =>
{
var message = Encoding.UTF8.GetString(ea.Body.ToArray());
Console.WriteLine($"收到消息: {message}");
//确认该消息已被消费
channel.BasicAck(ea.DeliveryTag, false);
};
string input;
do
{
Console.WriteLine("按回车开始消费");
input = Console.ReadLine();
//启动消费者 设置为手动应答消息
channel.BasicConsume("hello", false, consumer);
} while (input.Trim().ToLower() != "exit");
Console.WriteLine("消费者已启动");
Console.ReadKey();
channel.Dispose();
connection.Close();