使用Pub / Sub停止服务并在Google App Engine上运行时,会收到以下堆栈跟踪。
System.ObjectDisposedException: Safe handle has been closed
at System.Runtime.InteropServices.SafeHandle.DangerousAddRef
at System.StubHelpers.StubHelpers.SafeHandleAddRef
at Grpc.Core.Internal.ChannelSafeHandle.CreateCall
at Grpc.Core.Internal.AsyncCall`2.CreateNativeCall
at Grpc.Core.Internal.AsyncCall`2.Initialize
at Grpc.Core.Internal.AsyncCall`2.StartDuplexStreamingCall
at Grpc.Core.Calls.AsyncDuplexStreamingCall[TRequest,TResponse]
at Grpc.Core.DefaultCallInvoker.AsyncDuplexStreamingCall[TRequest,TResponse]
at Grpc.Core.Internal.InterceptingCallInvoker.AsyncDuplexStreamingCall[TRequest,TResponse]
at Google.Cloud.PubSub.V1.Subscriber.SubscriberClient.StreamingPull
at Google.Api.Gax.Grpc.ApiBidirectionalStreamingCall.<>c__DisplayClass0_0`2.<Create>b__0
at Google.Api.Gax.Grpc.ApiBidirectionalStreamingCall`2.Call
at Google.Cloud.PubSub.V1.SubscriberServiceApiClientImpl.StreamingPull
at Google.Cloud.PubSub.V1.SubscriberClientImpl.SingleChannel.<StartAsync>d__18.MoveNext
对于项目,我们使用带有this库的ASP.NET Core来处理Pub / Sub通信。使用Pub / Sub模拟器在本地调试时不存在该问题。因此,我们假设它与App Engine逐步淘汰docker容器的方式有关?只捕获异常将不是一个令人满意的解决方案,因为我们冒着处理消息未被确认的风险。我们能否以任何方式解决这个问题,以便我们能够安全地停止服务?
提前致谢。
答案 0 :(得分:1)
我发现错误在我的代码中...我在ASP.NET Core中使用IHostedService并使用以下方法停止订阅者:
node_modules
然而,这将触发并忘记,因此在将对象部署到服务提供者中之前不会等待客户端正确停止。当我使用 Google.Cloud.Diagnostics.AspNetCore (在服务提供商中注册并使用Grpc)来记录一些有用的调试语句时,它可以在最终使用之前进行处理。