【问题标题】:GRPC connection state listeners JavaGRPC 连接状态监听器 Java
【发布时间】:2018-06-21 14:18:16
【问题描述】:

我很有趣——我能收到一些关于 GRPC 客户端/服务器的连接/断开事件的通知吗? 现在,当客户端终止与服务器的连接时,我在服务器上遇到异常:

июн 22, 2018 9:34:47 AM io.grpc.netty.NettyServerTransport notifyTerminated
INFO: Transport failed
java.io.IOException: Удаленный хост принудительно разорвал существующее подключение
    at sun.nio.ch.SocketDispatcher.read0(Native Method)
    at sun.nio.ch.SocketDispatcher.read(SocketDispatcher.java:43)
    at sun.nio.ch.IOUtil.readIntoNativeBuffer(IOUtil.java:223)
    at sun.nio.ch.IOUtil.read(IOUtil.java:192)
    at sun.nio.ch.SocketChannelImpl.read(SocketChannelImpl.java:380)
    at io.netty.buffer.PooledUnsafeDirectByteBuf.setBytes(PooledUnsafeDirectByteBuf.java:288)
    at io.netty.buffer.AbstractByteBuf.writeBytes(AbstractByteBuf.java:1108)
    at io.netty.channel.socket.nio.NioSocketChannel.doReadBytes(NioSocketChannel.java:345)
    at io.netty.channel.nio.AbstractNioByteChannel$NioByteUnsafe.read(AbstractNioByteChannel.java:131)
    at io.netty.channel.nio.NioEventLoop.processSelectedKey(NioEventLoop.java:645)
    at io.netty.channel.nio.NioEventLoop.processSelectedKeysOptimized(NioEventLoop.java:580)
    at io.netty.channel.nio.NioEventLoop.processSelectedKeys(NioEventLoop.java:497)
    at io.netty.channel.nio.NioEventLoop.run(NioEventLoop.java:459)
    at io.netty.util.concurrent.SingleThreadEventExecutor$5.run(SingleThreadEventExecutor.java:886)
    at io.netty.util.concurrent.FastThreadLocalRunnable.run(FastThreadLocalRunnable.java:30)
    at java.lang.Thread.run(Thread.java:745)

异常翻译:“远程主机强行断开现有连接”

我很有趣,如何管理客户端和服务器的连接/断开连接事件?

也许有一些方法可以将我自己的侦听器附加到客户端或服务器?从来源我不知道如何制作它

【问题讨论】:

  • 我没有看到任何 exception 列出。我只看到一个日志语句。还有其他记录吗?
  • 是的,我在第一篇文章中添加了完整的日志信息。

标签: java grpc grpc-java


【解决方案1】:

gRPC 不会故意提供连接级别的通知。您没有提及您的用例,但绝大多数用例都被负载平衡、代理和 gRPC 的重新连接逻辑所破坏。

有一种方法可以通过ManagedChannel.getState(false) 确定 Channel 是否健康,这对于为用户提供 UI 或告诉其他客户端服务器不健康很有用。其他用例应建立在单独的 RPC 之上。

【讨论】:

  • 所以,如果我不想收到有关频道断开的通知 - 我需要使用 {ManagedChannel.getState(false)} 实现轮询?没有其他方式可以尽快通知频道状态变化?
  • 您应该真正解释您要实现的高级目标;你是用例。 ManagedChannel.notifyWhenStateChanged 可以在getState 更改时通知您
  • 如果我的 grpc 客户端服务没有连接到服务器,我需要将服务行为更改为“默认”。假设我有一项验证用户付款的服务。如果服务没有连接到服务器,我至少需要记录用户支付验证请求,而且,我需要检查“服务器服务”发生了什么。而且我想尽快收到有关“服务器服务”关闭的通知,而不是在某些用户尝试付款时。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-02-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-03-15
相关资源
最近更新 更多