rabiitmq 的 fanout 属于多播模式,他的工作图如下,应用场景挺多的。比如订单,客户下单后,会发送消息告诉客户下单成功,通知仓库出货等。
在上面的图可以看到,项目里有四个启动项目
这里用到RabbitmqFanoutConsumerSend,RabbitmqFanoutConsumerWMS,RabbitmqFanoutProduct这三个控制台,另外一个没用
RabbitmqFanoutProduct 属于生产端,当订单提交成功后,生产端回向某个交换器exchange (这里定义fanoutexchange)推送消息(这种模式是没用路由的) 然后会分别向(sendqueue)和(wmsqueue)两个队列里各种推送一条消息,再经过,各个消费端对各自的队列进行消费,做相关的业务。
我比较简单粗暴,直接上图上代码
代码里面有我写的注释,相信大家一看就懂
using RabbitMQ.Client;
using System;
using System.Text;
using System.Threading;
namespace RabbitmqFanoutProduct
{
class Program
{
static void Main(string[] args)
{
//创建连接工厂 用户名账户 ,密码/IP地址端口号
ConnectionFactory connectionFactory = new ConnectionFactory() {
Password="123456",
UserName="Henry",
HostName="localhost",
VirtualHost="Test"
,Port=5672
};
//创建连接
IConnection connection= connectionFactory.CreateConnection();
//创建通道
IModel channel= connection.CreateModel();
//这里定义交换器名称和 模式,
channel.ExchangeDeclare("fanoutexchange", ExchangeType.Fanout, true, false, null);
//队列都是在消费端定义的,哪个要监听,就加进来。
//接下来是发送信息
while (true)
{
string[] list = new string[] { "落叶的订单", "Kettle的订单", "Henry的订单", "微信173265046" };
foreach (var item in list)
{
string text = item + "---" + DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss");
Console.WriteLine("生产端推送订单"+ text);
byte[] content = Encoding.UTF8.GetBytes(text);
channel.BasicPublish("fanoutexchange", "", null, content);
Thread.Sleep(5000);
}
}
Console.ReadKey();
Console.WriteLine("Hello World!");
}
}
}
两个生产端分别如下,两个端用的消费模式是不一样的,大家要仔细看看
using RabbitMQ.Client;
using RabbitMQ.Client.Events;
using System;
using System.Text;
namespace RabbitmqFanoutProductSend
{
class Program
{
static void Main(string[] args)
{
//创建连接工厂 用户名账户 ,密码/IP地址端口号
ConnectionFactory connectionFactory = new ConnectionFactory()
{
Password = "123456",
UserName = "Henry",
HostName = "localhost",
VirtualHost = "Test"
,
Port = 5672
};
//创建连接
IConnection connection = connectionFactory.CreateConnection();
//创建通道
IModel channel = connection.CreateModel();
//这里定义交换器名称和 模式 durable 持久化 ,autodelete 断开删除
channel.ExchangeDeclare("fanoutexchange", ExchangeType.Fanout, true, false, null);
//定义短信队列
channel.QueueDeclare("sendqueue", true, false, false, null);
//绑定队列和交换器
channel.QueueBind( "sendqueue", "fanoutexchange", "",null);
//主要是不让整个队列一下子到消费端,减少消费端的压力
channel.BasicQos(0, 1, false);
//事件消费模式,另外一种模式在另外一个消费端展现
EventingBasicConsumer eventingBasicConsumer = new EventingBasicConsumer(channel);
eventingBasicConsumer.Received += (obj,evet)=>{
string content= Encoding.UTF8.GetString(evet.Body.ToArray());
Console.WriteLine($"消费端信息-收到订单{content} 发送短信");
//确认一个或多个已传递的消息 踢出队列
channel.BasicAck(evet.DeliveryTag, true);
// 当失败的时候 拒绝确认,是否放回队列
// channel.BasicReject(evet.DeliveryTag, true);
};
//开始消费某个队列,不自动确认,开始时间
channel.BasicConsume("sendqueue", false, eventingBasicConsumer);
Console.ReadKey();
Console.WriteLine("Hello World!");
}
}
}
using RabbitMQ.Client;
using System;
using System.Text;
using System.Threading;
namespace RabbitmqFanoutWMS
{
class Program
{
static void Main(string[] args)
{
//创建连接工厂 用户名账户 ,密码/IP地址端口号
ConnectionFactory connectionFactory = new ConnectionFactory()
{
Password = "123456",
UserName = "Henry",
HostName = "localhost",
VirtualHost = "Test"
,
Port = 5672
};
//创建连接
IConnection connection = connectionFactory.CreateConnection();
//创建通道
IModel channel = connection.CreateModel();
//这里定义交换器名称和 模式 durable 持久化 ,autodelete 断开删除
channel.ExchangeDeclare("fanoutexchange", ExchangeType.Fanout, true, false, null);
//定义短信队列
channel.QueueDeclare("wmsqueue", true, false, false, null);
channel.QueueBind( "wmsqueue", "fanoutexchange","", null);
while (true) {
//从哪个队列获取,是否自动确认 这里是否
BasicGetResult basicGetResult = channel.BasicGet("wmsqueue", false);
if (basicGetResult != null) {
string content = Encoding.UTF8.GetString(basicGetResult.Body.ToArray());
Console.WriteLine($"消费端仓库 -收到订单{content} 准备发货");
//确认
channel.BasicAck(basicGetResult.DeliveryTag, true);
}
Thread.Sleep(3000);
}
Console.ReadKey();
Console.WriteLine("Hello World!");
}
}
}
代码下载地址(免积分提供)
https://download.csdn.net/download/yu240956419/85351699 可以到我的资源里面找
### 启动后产生的队列如图
[外链图片转存中...(img-VoVITmfc-1652279605758)]
### 运行的时候如图
[外链图片转存中...(img-veBrmooL-1652279605758)]
代码下载地址(免积分提供)
https://download.csdn.net/download/yu240956419/85351699 可以到我的资源里面找
后面有时间再写其他剩下的topic 和header,rpc,死信队列等