1

我想根据产生错误的队列名称在 EasyNetQ 中给出错误队列名称。例如,来自的所有错误消息QueueA将转到QueueA.ErrorQueueB消息将被重定向到QueueB.Error,依此类推。

但是,ErrorQueueNamingConvention 没有像 ErrorExchangeNamingConvention 那样接收 MessageReceivedInfo 参数,因此我不知道原始队列的名称是什么。有没有办法得到它或任何解决方法?

谢谢

4

1 回答 1

2

您可以通过ErrorQueueNamingConventionIBus. 所以它是在总线级别完成的,而不是单个消息级别。我命名我的错误队列以匹配消费者绑定的队列(我在配置中定义)。例如,当处理来自 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。在那里你可以得到你正在寻找的上下文,尽管我认为你不需要它来获得你正在寻找的行为。

另请参阅此答案

于 2015-10-16T17:15:02.453 回答