EasyNetQ - 基于原始队列的自定义错误队列名称

时间:2015-08-24 18:35:34

标签: easynetq

我想根据发起错误的队列名称在EasyNetQ中提供错误队列名称。例如,来自QueueA的所有错误消息都会转到QueueA.Error; QueueB消息将被重定向到QueueB.Error,依此类推。

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

由于

1 个答案:

答案 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