我想根据发起错误的队列名称在EasyNetQ中提供错误队列名称。例如,来自QueueA
的所有错误消息都会转到QueueA.Error
; QueueB
消息将被重定向到QueueB.Error
,依此类推。
但是,ErrorQueueNamingConvention没有像ErrorExchangeNamingConvention那样收到MessageReceivedInfo参数,因此我不知道原始队列的名称是什么。有没有办法获得它或任何变通方法?
由于
答案 0 :(得分:1)
您可以在ErrorQueueNamingConvention
上设置IBus
来执行此操作。所以它是在总线级别完成的,而不是单个消息级别。我命名我的错误队列以匹配使用者绑定的队列(我在配置中定义)。例如,在处理来自队列A
的消息时发生错误时,这些错误将路由到队列A_Errors
。这是一个样本:
var errorExchangeName = _configuration.ExchangeName + "_Errors";
var errorQueueName = _configuration.ListenerQueueName + "_Errors";
var conventions = _bus.Advanced.Container.Resolve<IConventions>();
conventions.ErrorExchangeNamingConvention = info => errorExchangeName;
conventions.ErrorQueueNamingConvention = () => errorQueueName;
您可以在https://github.com/EasyNetQ/EasyNetQ/blob/master/Source/EasyNetQ/Consumer/DefaultConsumerErrorStrategy.cs的以下代码片段中看到EasyNetQ如何使用您的ErrorQueueNamingConvention
绑定到错误队列,以便它可以将消息转发给它:
private string DeclareErrorExchangeAndBindToDefaultErrorQueue(IModel model, ConsumerExecutionContext context)
{
var originalRoutingKey = context.Info.RoutingKey;
return errorExchanges.GetOrAdd(originalRoutingKey, _ =>
{
var exchangeName = conventions.ErrorExchangeNamingConvention(context.Info);
model.ExchangeDeclare(exchangeName, ExchangeType.Direct, durable: true);
model.QueueBind(conventions.ErrorQueueNamingConvention(), exchangeName, originalRoutingKey);
return exchangeName;
});
}
因此,如果您需要更多控制权,那么您也可以覆盖此DefaultConsumerErrorStrategy
。在那里你可以得到你正在寻找的背景,虽然我认为你不需要它来获得你正在寻找的行为。
另见this answer。