Grpc System.ObjectDisposedException: безопасный дескриптор закрыт - PullRequest
0 голосов
/ 03 июня 2018

При остановке службы с помощью 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

Для проекта мы используем ASP.NET Core с this библиотека для обработки связи Pub / Sub.Проблема отсутствует при локальной отладке с использованием эмулятора Pub / Sub.Следовательно, мы предполагаем, что это как-то связано с тем, как App Engine выводит из строя док-контейнер?Только перехват исключения не будет удовлетворительным решением, так как мы рискуем оставить обработанные сообщения неподтвержденными.Можем ли мы каким-либо образом решить эту проблему, чтобы мы могли безопасно остановить наш сервис?

Заранее спасибо.

1 Ответ

0 голосов
/ 12 июня 2018

Я обнаружил, что ошибка была в моем коде ... Я использую IHostedService в ASP.NET Core и остановил подписчика следующим образом:

cancellationToken.Register(async () => { await subscriber.StopAsync(token) })

Однако это сработает и забудет и, следовательно, не будет ждать, пока клиент остановится должным образом, прежде чем избавиться от объектов внутри поставщика услуг.Поскольку я использовал Google.Cloud.Diagnostics.AspNetCore (который зарегистрирован в поставщике услуг и использует Grpc) для регистрации некоторых полезных операторов отладки, он может быть удален перед конечным использованием.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...