您可以通過在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。