dotnet core use RabbitMQ
安装RabbitMQ
自从使用了Docker之后,发现Docker真的是比虚拟机好用啊, 因此我这里在Docker里面创建一个RabbitMQ容器.
这里注意获取镜像的时候要获取management版本的,不要获取last版本的,management版本的才带有管理界面.
# 拉取镜像
docker pull rabbitmq:management
# 运行镜像
docker run -d -p 5672:5672 -p 15672:15672 --name rabbitmq rabbitmq:management
此时你在本机访问http://localhost:15672/即可访问后台管理界面, 这里的默认用户名和密码都是guest.
创建项目
使用VS创建一个名为RabbitMQ的控制台项目, 项目源码在Gitee.
然后就是使用Nuget安装RabbitMQ.Client.
生产者代码
static void Producter(ConnectionFactory factory)
{
//创建连接
using (IConnection conn = factory.CreateConnection())
{
Console.WriteLine("\nRabbitMQ Connection Succeed!");
//创建通道
using (IModel channel = conn.CreateModel())
{
//声明一个队列
channel.QueueDeclare("firstChannel", false, false, false, null);
Console.WriteLine("\nPlease Enter Message or q to exit");
string input;
do
{
input = Console.ReadLine();
var sendBytes = Encoding.UTF8.GetBytes(input);
//发布消息
channel.BasicPublish("", "firstChannel", null, sendBytes);
} while (input.Trim().ToLower() != "q");
}
}
}
消费者代码
static void Consumer(ConnectionFactory factory)
{
//创建连接
using (IConnection conn = factory.CreateConnection())
{
Console.WriteLine("\nRabbitMQ Connection Succeed!");
//创建通道
using (IModel channel = conn.CreateModel())
{
//事件基本消费者
EventingBasicConsumer consumer = new EventingBasicConsumer(channel);
//接收到消息事件
consumer.Received += (ch, ea) =>
{
var message = Encoding.UTF8.GetString(ea.Body);
Console.WriteLine($"Got Message: {message}");
//确认该消息已被消费
channel.BasicAck(ea.DeliveryTag, false);
};
//启动消费者 设置为手动应答消息
channel.BasicConsume("firstChannel", false, consumer);
Console.WriteLine("Consumer Started");
Console.ReadKey();
}
}
}
启动函数
static void Main(string[] args)
{
//创建连接工厂
ConnectionFactory factory = new ConnectionFactory
{
UserName = "guest",//用户名
Password = "guest",//密码
HostName = "localhost"//rabbitmq ip
};
if (args.Length > 0 && args[0] == "p") Producter(factory);
else Consumer(factory);
//Console.WriteLine("Hello World!");
}
启动的时候加一个参数p则是启动生产者, 否则启动的就是消费者, 启动多个实例之后可以发现, 是可以事实订阅到消息的.
总结
我这这边可以同时启动多生产者或者消费者, 每个生产者生产的消息只会被消费一次.
AMQP协议中的核心思想就是生产者和消费者隔离,生产者从不直接将消息发送给队列。生产者通常不知道是否一个消息会被发送到队列中,只是将消息发送到一个交换机。先由Exchange来接收,然后Exchange按照特定的策略转发到Queue进行存储。同理,消费者也是如此。Exchange 就类似于一个交换机,转发各个消息分发到相应的队列中。
更多具体用法以及分发模型请参考这篇文章:https://www.cnblogs.com/stulzq/p/7551819.html
原创文章,转载请注明来源