2015-08-24 63 views
0

我想根據發生錯誤的隊列名稱在EasyNetQ中給出錯誤隊列名稱。例如,來自QueueA的所有故障消息將轉到QueueA.Error; QueueB消息將被重定向到QueueB.Error,依此類推。EasyNetQ - 基於原隊列的自定義錯誤隊列名稱

但是,ErrorQueueNamingConvention沒有收到MessageReceivedInfo參數,因爲ErrorExchangeNamingConvention的確如此,所以我不知道原始隊列的名稱是什麼。有什麼辦法獲得它或任何解決方法?

感謝

回答

0

您可以通過在IBus設置ErrorQueueNamingConvention做到這一點。所以它是在公交級別完成的,而不是在個人消息級別完成的。我將錯誤隊列命名爲與消費者綁定的隊列(我在配置中定義的隊列)匹配。例如,當處理來自隊列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