我想根据产生错误的队列名称在 EasyNetQ 中给出错误队列名称。例如,来自的所有错误消息QueueA
将转到QueueA.Error
;QueueB
消息将被重定向到QueueB.Error
,依此类推。
但是,ErrorQueueNamingConvention 没有像 ErrorExchangeNamingConvention 那样接收 MessageReceivedInfo 参数,因此我不知道原始队列的名称是什么。有没有办法得到它或任何解决方法?
谢谢
我想根据产生错误的队列名称在 EasyNetQ 中给出错误队列名称。例如,来自的所有错误消息QueueA
将转到QueueA.Error
;QueueB
消息将被重定向到QueueB.Error
,依此类推。
但是,ErrorQueueNamingConvention 没有像 ErrorExchangeNamingConvention 那样接收 MessageReceivedInfo 参数,因此我不知道原始队列的名称是什么。有没有办法得到它或任何解决方法?
谢谢
您可以通过ErrorQueueNamingConvention
在IBus
. 所以它是在总线级别完成的,而不是单个消息级别。我命名我的错误队列以匹配消费者绑定的队列(我在配置中定义)。例如,当处理来自 queue 的消息时发生错误时A
,这些错误将被路由到 queue 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
。在那里你可以得到你正在寻找的上下文,尽管我认为你不需要它来获得你正在寻找的行为。
另请参阅此答案。