@埃里克是对的。
这里我只是展示我遇到的问题。希望这也能帮助其他遇到同样问题的人。
在服务器端,我发现有许多异常,例如
Apr 19, 2018 5:06:07 PM io.grpc.internal.SerializingExecutor run
SEVERE: Exception while executing runnable io.grpc.internal.ServerImpl$JumpToApplicationThreadServerStreamListener$1MessagesAvailable@752265fc
redis.clients.jedis.exceptions.JedisException: Could not return the resource to the pool
at redis.clients.jedis.JedisPool.returnResource(JedisPool.java:256)
at redis.clients.jedis.JedisPool.returnResource(JedisPool.java:16)
at redis.clients.jedis.Jedis.close(Jedis.java:3409)
...
at io.grpc.stub.ServerCalls$StreamingServerCallHandler$StreamingServerCallListener.onMessage(ServerCalls.java:251)
at io.grpc.internal.ServerCallImpl$ServerStreamListenerImpl.messagesAvailable(ServerCallImpl.java:251)
at io.grpc.internal.ServerImpl$JumpToApplicationThreadServerStreamListener$1MessagesAvailable.runInContext(ServerImpl.java:592)
at io.grpc.internal.ContextRunnable.run(ContextRunnable.java:37)
at io.grpc.internal.SerializingExecutor.run(SerializingExecutor.java:107)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)
at java.lang.Thread.run(Thread.java:748)
Caused by: redis.clients.jedis.exceptions.JedisConnectionException: java.net.SocketTimeoutException: Read timed out
at redis.clients.util.RedisInputStream.ensureFill(RedisInputStream.java:202)
at redis.clients.util.RedisInputStream.readByte(RedisInputStream.java:40)
at redis.clients.jedis.Protocol.process(Protocol.java:151)
at redis.clients.jedis.Protocol.read(Protocol.java:215)
at redis.clients.jedis.Connection.readProtocolWithCheckingBroken(Connection.java:340)
at redis.clients.jedis.Connection.getAll(Connection.java:310)
at redis.clients.jedis.Connection.getAll(Connection.java:302)
at redis.clients.jedis.Pipeline.sync(Pipeline.java:99)
at redis.clients.jedis.Pipeline.clear(Pipeline.java:85)
at redis.clients.jedis.BinaryJedis.resetState(BinaryJedis.java:1781)
at redis.clients.jedis.JedisPool.returnResource(JedisPool.java:252)
... 13 more
Caused by: java.net.SocketTimeoutException: Read timed out
由于它提到了redis,我查看了相关代码,发现JedisPoolConfig可能没有足够的线程,默认超时时间可能太短。
所以我把两者都放大了,问题就解决了。
换句话说,服务器没有足够的资源在所需的时间内处理客户端请求。这导致gRPC服务器失败,因此调用了客户端onError()方法。
谢谢你,埃里克。