如何在RabbitMQ中设置多个队列并使用MassTransit 3进行连接
本文关键字:MassTransit 连接 队列 RabbitMQ 设置 | 更新日期: 2023-09-27 18:25:14
问题
使用MassTransit,我看到了连接到如下队列的示例:
var host = x.Host(new Uri("rabbitmq://localhost/Dev_Queue"), h =>
{
h.Username("guest");
h.Password("guest");
});
然而,当我尝试这样做时,我不断得到以下异常:
{"连接失败:guest@localhost:5672/Dev_Queue"}
内部消息:
{"AMQP操作被中断:AMQP关闭原因,由库启动,代码=541,文本=''"意外异常''",classId=0,methodId=0,cause=System.IO.IOException:无法从传输连接读取数据:现有连接被远程主机强制关闭。--->System.Net.Sockets.SocketException:现有连接被位于System.Net.Ssockets.Receive(Byte[]缓冲区,Int32偏移量,Int32大小,SocketFlags SocketFlags)的远程主机''r''n强制关闭。"''''r''n在System.Net.Socket.NetworkStream.Read(Byte[]缓冲区,Int32偏移量,Int32大小)''r''n-内部异常堆栈跟踪结束---''r''n在RabbitMQ.Client.Impl.Frame.ReadFrom(NetworkBinaryReader读取器)''r''n在RabitMQ.Client.Empl.SocketFrameHandler.ReadFrame("}
如果我没有指定队列,那么它可以正常工作。
完整配置
这将起作用,因为我不指定队列,只指定url。
var busControl = Bus.Factory.CreateUsingRabbitMq(x =>
{
x.AutoDelete = false;
x.UseJsonSerializer();
x.UseTransaction();
x.ExchangeType = "direct";
x.Durable = true;
var host = x.Host(new Uri("rabbitmq://localhost/"), h =>
{
h.Username("guest");
h.Password("guest");
});
x.UseRetry(Retry.Immediate(2));
});
背景
我们有两台服务器,我们想运行一个集群以实现高可用性。我能够很好地创建集群,并看到在每个节点上复制的队列。
问题是,这些机器有共享的"环境"。它们必须共享,因为我们进行蓝/绿部署,而且我们不知道生产中是否有哪套服务器。这就是为什么我想要Beta和Production队列,但是,在MassTransit中,我无法成功指向我希望消息进入的特定队列。
如有任何关于此体系结构的帮助或其他见解,我们将不胜感激。
使用MassTransit,主机仅指定主机名和虚拟主机名。因此,在上面的示例中,需要存在一个名为"Dev_Queue"的虚拟主机。显然这不是你的意图。
在完整的示例中,您需要添加用于接收消息的接收端点。
var busControl = Bus.Factory.CreateUsingRabbitMq(x =>
{
x.AutoDelete = false;
x.UseJsonSerializer();
x.UseTransaction();
x.ExchangeType = "direct";
x.Durable = true;
var host = x.Host(new Uri("rabbitmq://localhost/"), h =>
{
h.Username("guest");
h.Password("guest");
});
x.UseRetry(Retry.Immediate(2));
x.ReceiveEndpoint("Dev_Queue", e =>
{
e.Consumer(() => new MyConsumer());
})
});
此外,请查看v2:的迁移文档
http://docs.masstransit-project.com/en/latest/migrating/index.html