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

标签 c# .net messaging rebus

在 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/

相关文章:

c# - key 存储提供程序不能设置多次(始终使用 Azure Function 进行加密)

c# - 这个xml解析错误怎么处理?

java - Spring amqp——异步请求/响应场景下的消息关联

asynchronous - 实现可靠异步消息访问的服务版本控制的权衡?

c# - 线程与等待任务之间的通信

c# - RMI,现代 Java 相当于 .NET WCF(Windows 通信基础)吗?

c# - Winforms 组合框数据绑定(bind)整个对象(无数据成员)

c# - 如何同时将多个视频文件上传到 youtube?

.net - EF4 如何在事务中包装 2 个更新

.net - 接口(interface)是否应该与实现它们的具体类在同一个命名空间中?