在Rebus(https://github.com/rebus-org/Rebus/wiki/Automatic-retries-and-error-handling)中使用二级重试,我需要在n次重试后将消息转发到错误队列。

这有效:

_bus.Advanced.Routing.Send("my-queue.error",failedMessage.Message, failedMessage.Message);


但是失败消息中累积的异常不会带来,从而使错误队列中的失败消息变得毫无用处。

理想情况下,我会挂入ITransport实例,并执行类似的操作

await _transport.Send(errorQueueAddress, transportMessage, transactionContext);


(来自PoisonQueueErrorHandlerhttps://github.com/rebus-org/Rebus/blob/333dbedf486acb92bd6c6250755537032c6215fd/Rebus/Retry/PoisonQueues/PoisonQueueErrorHandler.cs

但是没有明显的方法可以到达该实例。

关于如何实现这一目标的任何想法?

最佳答案

将消息从第二级处理程序转发到错误队列的一种方法是简单地引发异常-通常的n重试也适用于第二级重试,因此,如果一切都失败了,则消息最终将最终导致错误队列。

如果您确实想在将消息转发到错误队列时模仿Rebus的行为,则可以获取完整的错误详细信息,因为Rebus会通过ErrorDescription属性中的IFailed<YourMessage>属性包含它们。

然后,您可以在转发消息时创建以下标头:

var details = failedMessage.ErrorDescription;

var headers = new Dictionary<string, string>
{
    {Headers.SourceQueue, "your-input-queue"},
    {Headers.ErrorDetails, details}
};


然后您应该将传输消息转发到错误队列,从而保留消息身份和所有其他标头完全不变:

await bus.Advanced.TransportMessage.Forward("error", headers);


我认为这将是Rebus行为的最现实的模仿。

08-18 05:40