0

我们有使用 Grpc.Net.Client 包的 gRPC 客户端——当服务创建并设置异步回调时,要知道服务是否已启动并正确连接似乎并不容易。

我们当前的解决方案是通过 HttpRequestException 等待异步调用失败(大约一秒钟后),然后我们返回并尝试在一个长时间运行的循环中再次订阅服务,直到我们恢复并运行服务。有没有一种方法可以 a) 在我们尝试调用我们的 subscribe 方法之前确定服务的状态,并且 b) 有没有比捕获异常和循环更好的方法来处理我们的服务?

请注意,即使服务关闭,服务的创建和对订阅的调用也会正常工作并返回而不会出错,并且 foreach 循环会被执行,然后大约 1 秒后会引发异常。我也真的不想依赖睡眠声明!

代码看起来像这样:

service = channel.CreateGrpcService<IManagedOrderGRPCService>();
while(true)
{
  var response = this.Subscribe(), default);
  await foreach (var update in response)
  {
     // Do something with the update
  }
  catch (Exception e)
  {
     log.LogWarning ($"[{Name}]:: Lost connection to service - for  [{e.Message}]");
  }
  Thread.Sleep (7000);
}

有关服务声明的信息(使用代码优先 gRPC,.net Core 5):

[ServiceContract]
public interface IManagedOrderGRPCService
{
  [OperationContract]
  IAsyncEnumerable<ManagedOrderUpdate> Subscribe (CallContext context = default );
}
4

0 回答 0