【问题标题】:How do I know if the GRPC connection has been lost?如何知道 GRPC 连接是否已丢失?
【发布时间】:2020-08-31 07:01:16
【问题描述】:

我已经用 Java 实现了 GRPC 客户端。

String host:"192.893.12.11";
int port:9090; 

ManagedChannel managedChannel = ManagedChannelBuilder.forAddress(host, port).usePlaintext().build();

我想在 grpc 连接丢失时得到通知。 GRPC连接丢失如何通知客户端?

【问题讨论】:

  • 刚刚浏览了ManagedChannel 的JavaDocs,似乎有一个ManagedChannel.notifyWhenStateChanged 方法 - 这可以满足您的需要吗?
  • 这个方法怎么用?有例子吗?
  • notifyWhenStateChanged 可能会有所帮助。如Javadoc 中所述,它的用法应该相当简单。注意notifyWhenStateChanged 只能检测通道状态变化。但是,通道状态不一定反映 TCP 连接的生命周期。即使网络连接在中间断开,TCP 套接字也可以保持打开(或由操作系统静默关闭)。所以 gRPC 只能知道连接断开了,套接字上的写入失败。
  • 使用 RPC 的生命周期更准确。如果有帮助,您可以使用流式 RPC。只要 RPC 处于 TCP 连接状态,就可以持续存在。

标签: java connection grpc grpc-java


【解决方案1】:

您可以使用 ManagedChannel 的 notifyWhenStateChanged 方法在频道状态发生变化时获取通知,例如想要在服务器关闭时获取通知,您可以尝试以下代码:

// create a ManagedChannel 
ManagedChannel channel = ManagedChannelBuilder.forTarget(target)
        .usePlaintext()
        .build();

// add callback method
channel.notifyWhenStateChanged(ConnectivityState.SHUTDOWN, () -> System.out.println("server shutdown"));

【讨论】:

  • 这是错误的,因为第一个参数是当前状态而不是目标状态。
猜你喜欢
  • 2016-10-08
  • 2019-09-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-06-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多