在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)
但没有明显的方法可以达到那个实例。
关于如何实现这一目标的任何想法?
答案 0 :(得分:1)
从第二级处理程序将消息转发到错误队列的一种方法是简单地抛出异常 - 通常的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行为的最真实的模仿。