如何将异常消息转发到 Rebus 错误队列

How to forward a message with exceptions to Rebus error queue

在 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

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

关于如何实现这一点有什么想法吗?

将消息从二级处理程序转发到错误 queue 的一种方法是简单地抛出异常 - 通常的 n 重试也适用于二级重试,因此如果一切正常失败,消息最终将以错误 queue.

结束

如果您真的想在将消息转发到错误 queue 时模仿 Rebus 的行为,您可以获得完整的错误详细信息,因为 Rebus 通过 ErrorDescription 属性 在 IFailed<YourMessage>.

然后您可以在转发邮件时创建这些headers:

var details = failedMessage.ErrorDescription;

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

然后您应该将传输消息转发给错误queue,从而完整地保留消息身份和所有其他headers:

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

我认为这将是对雷布思行为最真实的模仿。