在 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)
但是没有明显的方法可以到达那个实例。
关于如何实现这一点有什么想法吗?
最佳答案
将消息从二级处理程序转发到错误队列的一种方法是简单地抛出异常——通常的 n
重试也适用于二级重试,因此如果一切都失败,消息最终将进入错误队列。
如果您使用的是 Rebus 6.2.1 或更高版本,ITransportMessageApi
上有一个扩展方法这使您可以在感觉像这样时手动对消息进行死信处理:
await bus.Advanced.TransportMessage.Deadletter("whatever error details you'd like to include!");
如果您使用的是 Rebus 6.7.0 或更高版本,Deadletter
方法有一个也接受异常的重载,这很适合做这样的事情:
try
{
// try something that can fail
}
catch (Exception exception)
{
await bus.Advanced.TransportMessage.Deadletter(exception);
}
以下答案与 6.2.1 以下的 Rebus 版本相关:
如果您真的想在将消息转发到错误队列时模拟 Rebus 的行为,您可以获得完整的错误详细信息,因为 Rebus 通过 ErrorDescription
包含了它们。属性(property) IFailed<YourMessage>
.
然后您可以在转发邮件时创建这些 header :
var details = failedMessage.ErrorDescription;
var headers = new Dictionary<string, string>
{
{Headers.SourceQueue, "your-input-queue"},
{Headers.ErrorDetails, details}
};
然后您应该将传输消息转发到错误队列,从而完整地保留消息标识和所有其他 header :
await bus.Advanced.TransportMessage.Forward("error", headers);
我认为这将是对雷布思行为最真实的模仿。
关于c# - 如何将异常消息转发到 Rebus 错误队列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43760922/