我正在使用NService创建端点。
端点正在侦听事件并进行一些计算,然后将结果(成功或失败)发布到其他端点
我知道NServiceBus支持InstantRetry和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
答案 0 :(得分:0)
我不确定为什么要这样做,但是您是否看过NServiceBus sagas?它们旨在在必须通过(外部)服务进行阻塞IO时使用。如果在分配的时间内未执行特定任务,或者因为返回的结果不正确,则可以根据事实采取其他措施。
请参见以下传奇故事示例:
以下是显示saga超时用法的示例。如果未在特定时间内执行特定任务,则可以执行替代操作,例如发布事件或执行ReplyToOriginator
通过使用sagas,您可以使过程明确。我会避免为此而陷入恢复机制。
恢复机制旨在处理瞬态错误,例如网络连接问题,数据库死锁等,但不处理预期的失败结果。您应该适当地处理这些问题,并沿着其不愉快的道路继续进行建模。