c# - NServiceBus,在将消息发送到错误队列之前如何执行操作?
问题描述
我正在使用 NService 创建端点。
端点正在监听事件并进行一些计算,然后将结果(成功或失败)发布到其他端点
我知道 NServiceBus 支持 ImmediateRetry 和 DelayRetry,它们是可配置的。
现在,我想在所有重试之后(在发送到错误队列之前)将失败结果事件发布到其他端点。
public async Task Handle(MyEvent message, IMessageHandlerContext context)
{
Console.WriteLine($"Received MyEvent, ID = {message.Id}");
//Connect to other services to get data and do some calculation
Thread.Sleep(1000);
Console.WriteLine($"Processed MyEvent, ID = { message.Id}");
await context.Publish(new MyEventResult { IsSucceed = true });
}
以上是我当前的代码。如果没有异常抛出,它将发布成功的结果。但是如果它有一个致命的异常,我不知道如何在消息发送到错误队列之前发布一个失败结果事件。
提前致谢。
注意:我正在使用 NServiceBus 6.4.3
解决方案
我不确定你为什么想要这个,但你看过 NServiceBus sagas 吗?它们旨在在必须通过(外部)服务进行阻塞 IO 时使用。如果在分配的时间段内未执行特定任务或由于返回的结果不正确,您可以根据事实采取替代操作。
请参阅以下 saga 示例:
下面是一个示例,展示了 saga 超时的用法。如果在特定持续时间内未执行特定任务,则可以执行替代操作,例如发布事件或执行ReplyToOriginator
- https://docs.particular.net/nservicebus/sagas/timeouts
- https://docs.particular.net/nservicebus/sagas/reply-replytooriginator-differences
- https://docs.particular.net/nservicebus/sagas/#notifying-callers-of-status
通过使用 sagas,您可以明确您的流程。我会避免为此使用恢复机制。
恢复机制旨在处理网络连接问题、数据库死锁等瞬时错误,但不处理预期的故障结果。您应该正确处理这些并在其不愉快的路径中继续您的建模过程。
推荐阅读
- python-3.x - 图像上对象之间的距离
- javascript - 编辑器之前需要的制表符表上下文单击事件
- python - 如何编辑附加数据?
- python - 转换为熊猫日期时间格式时的数据框列导致 NaT
- firebase - 通过身份验证来限制对 Firebase 的访问是否更好?
- python-3.x - 如何在文本文件的字符串末尾添加换行符?
- java - Appium for iOS 需要很长时间才能在屏幕上找到显示视频广告的元素
- javascript - 使用 mapmyindia 的 Autosuggest API
- sql - 如何拉出日期值为空的行
- java - 从膨胀活动访问 AlertDialog 中的视图