如何将异常消息转发到 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);
(来自 PoisonQueueErrorHandler
:https://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);
我认为这将是对雷布思行为最真实的模仿。
在 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);
(来自 PoisonQueueErrorHandler
:https://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);
我认为这将是对雷布思行为最真实的模仿。