Azure 服务总线:Microsoft.Azure.WebJobs.Script.HostDisposedException:主机已释放,无法使用

Posted

技术标签:

【中文标题】Azure 服务总线:Microsoft.Azure.WebJobs.Script.HostDisposedException:主机已释放,无法使用【英文标题】:Azure Service Bus: Microsoft.Azure.WebJobs.Script.HostDisposedException: The host is disposed and cannot be used 【发布时间】:2021-09-19 08:59:00 【问题描述】:

有谁知道这个错误代表什么?我们目前正在使用 Azure 服务总线,并试图理解它的含义。

Microsoft.Azure.WebJobs.Script.HostDisposedException:主机已释放,无法使用。处置对象:'Microsoft.Azure.WebJobs.Script.WebHost.DependencyInjection.ScopedResolver';在堆栈跟踪中找到 IListener:'Microsoft.Azure.WebJobs.ServiceBus.Listeners.ServiceBusListener

【问题讨论】:

看起来他们还不知道根本原因。我会继续打开一个 GitHub 问题并提供完整的堆栈跟踪,以帮助他们收集查找原因所需的信息。 github.com/Azure/azure-functions-host/pull/6758 你在使用 ServiceBus 触发的 Azure Functions 吗? 是的,具有 Azure 功能的@PrasadBhokare 服务总线 为什么这个问题被否决了?尝试学习@PrasadBhokare 对不起。我投票给你了吗? 【参考方案1】:

看起来你也面临着这个在 GitHub 中仍然存在的确切已知问题 https://github.com/Azure/azure-functions-host/issues/5240

如“petterek”所述,您可以通过以下方式尝试解决方法

using (var scope = scopeFactory.CreateScope())

或者,在解决此问题之前,您可以增加重试次数,这是我们的临时修复,使消息具有幂等性并增加重试次数。

【讨论】:

哈哈我有同样的问题哈哈。至少我们必须在这里见面:D 哈哈很高兴见到你@VarunSharma 希望你一切都好。请记住,如果您使用的是处理此消息的 Azure 函数,重试计数不会有太大帮助,因为重试会立即发生。有一个新更新的 5.xxx nuget 包扩展,用于提供指数关系的函数【参考方案2】:

好的,再来一次。作为 .NET 6 升级的一部分,我将我们的 azure 函数从 v3 升级到 v4,突然开始出现类似的异常。甚至函数也会随机触发。

Container 已处置且不应使用:Container 已处置。您可以通过以下方式将 Dispose 堆栈跟踪包含在消息中:container.With(rules => rules.WithCaptureContainerDisposeStackTrace()) p>

主机已废弃,无法使用。已处置对象:“Microsoft.Azure.WebJobs.Script.WebHost.DependencyInjection.ScopedResolver”容器已处置且不应使用:已处置容器。 您可以通过以下方式将 Dispose 堆栈跟踪包含在消息中: container.With(rules => rules.WithCaptureContainerDisposeStackTrace())

添加配置设置 AzureFunctionsWebHost__hostId 解决了 90% 的这些错误。你可以阅读更多here。原因是我们的函数名超过了 32 个字符。

但是对于剩下的 10% 的情况,我不得不调试框架代码,因为它没有告诉我它试图解析什么对象并且失败了。幸运的是,在异常的调用堆栈unwinding 过程中,我能够看到局部变量并看到对象。然后我必须更改 StartUp/Program 类中的 DI 代码。我们使用 x => x.GetService 之类的语法更新和解析了一些单例对象,但我将其替换为新对象。 V4 中有一个关于如何在 JobHost 中解析 DI 范围的重大更改。请参阅here 了解更多信息。

希望这对其他人有所帮助。

【讨论】:

以上是关于Azure 服务总线:Microsoft.Azure.WebJobs.Script.HostDisposedException:主机已释放,无法使用的主要内容,如果未能解决你的问题,请参考以下文章

Azure 服务总线队列性能

服务总线触发 Azure 函数

Azure 服务总线消息生存时间设置 [关闭]

Azure 函数 - 从 Azure 密钥保管库获取服务总线连接字符串

Nestjs 上的 Azure 服务总线侦听器

在本地测试 Azure 服务总线,无需任何订阅或登录