在为队列生成名称时,EasyNetQ的默认行为是使用消息类型名称并将其附加到订阅ID。例如PartyInvitation
,命名空间中的消息类型EasyNetQ.Tests.Integration
将使用队列名称EasyNetQ.Tests.Integration.PartyInvitation:EasyNetQ.Tests_schedulingTest1,假设订阅ID为schedulingTest1
。
命名约定
您可以通过实现IConventions或继承默认约定来创建自己的自定义命名约定,并在服务容器中注册此实现:
public class MyConventions : Conventions { public MyConventions(ITypeNameSerializer typeNameSerializer) : base(typeNameSerializer) { ErrorQueueNamingConvention = messageInfo => "MyErrorQueue" ; } } var bus = RabbitHutch.CreateBus(connectionString, services => services.Register(c => new MyConventions()));
另见:https://github.com/EasyNetQ/EasyNetQ/wiki/Replacing-EasyNetQ-Components
控制队列名称
要控制单个队列的名称,请使用以下Queue
属性注释消息类:
[Queue("TestMessagesQueue", ExchangeName = "MyTestExchange")] public class TestMessage { public string Text { get; set; } } // ... bus.Subscribe<TestMessage>(string.Empty, msg => Console.WriteLine(msg.Text));
在这里,我们告诉EasyNetQ使用TestMessagesQueue作为队列名称,并使用MyTestExchange作为交换名称。请注意,传递给Subscribe方法的subscriptionId为空。如果指定subscriptionId,则它将附加到末尾并用作队列名称。
使用EasyNetQ未发布的消息
使用QueueAttribute允许使用来自任何队列的消息。这可用于消耗由EasyNetQ以外的框架发布的消息,只要满足一个条件 - 队列消息具有属性type
集。type
在消息反序列化期间使用属性值来确定消息的类型。只要将此属性设置为有意义的内容,就可以使用消息。解码类型名称在ITypeNameSerializer.Deserialize
方法中完成。
如果您决定实现自己的自定义,请ITypeNameSerializer
注意如何实现该Deserialize
方法。如果您的实现是处理器密集型的,那么您就有可能限制可以使消息出列的速度。例如,没有某种类型的缓存,程序集扫描是一个坏主意。
命名队列的注意事项
将队列名称设置为空字符串将使用默认命名行为。队列名称的最大长度为255个字符(这由RabbitMQ客户端库强制执行)。名称可以是字母,数字,连字符,下划线,句点或冒号的序列。队列名称以“amq”开头。保留用于预先声明和标准化的队列。