gpt4 book ai didi

NServiceBus HandleMessage 异步导致崩溃

转载 作者:行者123 更新时间:2023-12-02 00:15:08 25 4
gpt4 key购买 nike

我正在查看 NServiceBus v3.3.0.0,在我们的 MessageHandler 中它调用外部 WCF 服务。

如果 WCF 服务被同步调用并且该服务抛出异常,NServiceBus 会完美地处理它并根据配置重试该过程。

但是,如果异步调用 WCF 服务并抛出异常,则订阅者进程会崩溃。

因此,例如,如果 service.Update 抛出异常,它会很好地处理异常

   public class LeagueMessageHandler : IHandleMessages<LeagueMessage>
{
public void Handle(LeagueMessage message)
{
var service = new LeagueService.LeagueContractClient();
var league = service.Update(leagueDto);
}
}

但如果对 service.UpdateAsync 的调用抛出异常,则进程崩溃

   public class LeagueMessageHandler : IHandleMessages<LeagueMessage>
{
public async void Handle(LeagueMessage message)
{
var service = new LeagueService.LeagueContractClient();
var league = await service.UpdateAsync(leagueDto);
}
}

WCF 服务只是作为服务引用添加到类库中,它生成异步方法包装器。

根据 Adam 和 Udi 的评论进行编辑。

看起来这个问题与 NServiceBus 无关,它更多地与控制台应用程序如何处理抛出异常的异步方法有关。请看主题

Catch unhandled exceptions from async

Stephen Cleary 写了这个

http://nuget.org/packages/Nito.AsyncEx

这可以帮助您推出自己的 SynchronisationContext 来处理异常捕获。所以上面的 WCF 调用被包装成这样......

        var league = AsyncContext.Run(() => service.UpdateAsync(leagueDto));

当抛出异常时,它会在该上下文中被捕获并且控制台应用程序不再关闭。

最佳答案

当您将其称为异步时,异常发生在与处理消息的线程不同的线程上。出于这个原因,NServiceBus 无法知道是哪条消息导致了该异常,因此它无法回滚任何内容。

当使用 NServiceBus 时,您的整体架构已经是异步的 - 实际上没有必要异步执行这些 WCF 调用。

关于NServiceBus HandleMessage 异步导致崩溃,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13588685/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com