dragontree101 / springboot-thrift-etcd-ribbon

基于springboot的thrift的rpc, 服务发现基于etcd,路由基于ribbon
81 stars 59 forks source link

io.netty.util.concurrent.BlockingOperationException: DefaultPromise@7ccac308(incomplete) #3

Open vrain521 opened 6 years ago

vrain521 commented 6 years ago

再次感谢大神分享哈~ 让我能够借鉴来改造公司项目~ 报错异常信息如下:

io.netty.util.concurrent.BlockingOperationException: DefaultPromise@7ccac308(incomplete)
    at io.netty.util.concurrent.DefaultPromise.checkDeadLock(DefaultPromise.java:391) [netty-common-4.1.0.CR7.jar:4.1.0.CR7]
    at io.netty.util.concurrent.DefaultPromise.awaitUninterruptibly(DefaultPromise.java:284) [netty-common-4.1.0.CR7.jar:4.1.0.CR7]
    at mousio.client.promises.ResponsePromise.waitForPromiseSuccess(ResponsePromise.java:189) [etcd4j-2.11.0.jar:2.11.0]
    at mousio.etcd4j.promises.EtcdResponsePromise.get(EtcdResponsePromise.java:58) ~[etcd4j-2.11.0.jar:2.11.0]
    at com.dragon.study.springboot.autoconfigure.etcd.EtcdListener.onResponse(EtcdListener.java:71) ~[classes/:na]
    at mousio.client.promises.ResponsePromise.handlePromise(ResponsePromise.java:132) [etcd4j-2.11.0.jar:2.11.0]
    at mousio.client.promises.ResponsePromise$1.operationComplete(ResponsePromise.java:63) [etcd4j-2.11.0.jar:2.11.0]
    at mousio.client.promises.ResponsePromise$1.operationComplete(ResponsePromise.java:60) [etcd4j-2.11.0.jar:2.11.0]
    at io.netty.util.concurrent.DefaultPromise.notifyListener0(DefaultPromise.java:683) [netty-common-4.1.0.CR7.jar:4.1.0.CR7]
    at io.netty.util.concurrent.DefaultPromise.notifyListeners0(DefaultPromise.java:604) [netty-common-4.1.0.CR7.jar:4.1.0.CR7]
    at io.netty.util.concurrent.DefaultPromise.notifyListeners(DefaultPromise.java:564) [netty-common-4.1.0.CR7.jar:4.1.0.CR7]
    at io.netty.util.concurrent.DefaultPromise.setSuccess(DefaultPromise.java:398) [netty-common-4.1.0.CR7.jar:4.1.0.CR7]
    at mousio.etcd4j.transport.EtcdResponseHandler.channelRead0(EtcdResponseHandler.java:140) [etcd4j-2.11.0.jar:2.11.0]
    at mousio.etcd4j.transport.EtcdResponseHandler.channelRead0(EtcdResponseHandler.java:47) [etcd4j-2.11.0.jar:2.11.0]
    at io.netty.channel.SimpleChannelInboundHandler.channelRead(SimpleChannelInboundHandler.java:105) [netty-transport-4.1.0.CR7.jar:4.1.0.CR7]
    at io.netty.channel.ChannelHandlerInvokerUtil.invokeChannelReadNow(ChannelHandlerInvokerUtil.java:83) [netty-transport-4.1.0.CR7.jar:4.1.0.CR7]
    at io.netty.channel.DefaultChannelHandlerInvoker.invokeChannelRead(DefaultChannelHandlerInvoker.java:154) [netty-transport-4.1.0.CR7.jar:4.1.0.CR7]
    at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:354) [netty-transport-4.1.0.CR7.jar:4.1.0.CR7]
    at io.netty.channel.AbstractChannelHandlerContext.fireChannelRead(AbstractChannelHandlerContext.java:145) [netty-transport-4.1.0.CR7.jar:4.1.0.CR7]
    at io.netty.handler.codec.MessageToMessageDecoder.channelRead(MessageToMessageDecoder.java:103) [netty-codec-4.1.0.CR7.jar:4.1.0.CR7]
    at io.netty.channel.ChannelHandlerInvokerUtil.invokeChannelReadNow(ChannelHandlerInvokerUtil.java:83) [netty-transport-4.1.0.CR7.jar:4.1.0.CR7]
    at io.netty.channel.DefaultChannelHandlerInvoker.invokeChannelRead(DefaultChannelHandlerInvoker.java:154) [netty-transport-4.1.0.CR7.jar:4.1.0.CR7]
    at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:354) [netty-transport-4.1.0.CR7.jar:4.1.0.CR7]
    at io.netty.channel.AbstractChannelHandlerContext.fireChannelRead(AbstractChannelHandlerContext.java:145) [netty-transport-4.1.0.CR7.jar:4.1.0.CR7]
    at io.netty.channel.ChannelInboundHandlerAdapter.channelRead(ChannelInboundHandlerAdapter.java:86) [netty-transport-4.1.0.CR7.jar:4.1.0.CR7]
    at io.netty.channel.ChannelHandlerInvokerUtil.invokeChannelReadNow(ChannelHandlerInvokerUtil.java:83) [netty-transport-4.1.0.CR7.jar:4.1.0.CR7]
    at io.netty.channel.DefaultChannelHandlerInvoker.invokeChannelRead(DefaultChannelHandlerInvoker.java:154) [netty-transport-4.1.0.CR7.jar:4.1.0.CR7]
    at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:354) [netty-transport-4.1.0.CR7.jar:4.1.0.CR7]
    at io.netty.channel.AbstractChannelHandlerContext.fireChannelRead(AbstractChannelHandlerContext.java:145) [netty-transport-4.1.0.CR7.jar:4.1.0.CR7]
    at io.netty.channel.CombinedChannelDuplexHandler$DelegatingChannelHandlerContext.fireChannelRead(CombinedChannelDuplexHandler.java:433) [netty-transport-4.1.0.CR7.jar:4.1.0.CR7]
    at io.netty.handler.codec.ByteToMessageDecoder.fireChannelRead(ByteToMessageDecoder.java:277) [netty-codec-4.1.0.CR7.jar:4.1.0.CR7]
    at io.netty.handler.codec.ByteToMessageDecoder.channelRead(ByteToMessageDecoder.java:264) [netty-codec-4.1.0.CR7.jar:4.1.0.CR7]
    at io.netty.channel.CombinedChannelDuplexHandler.channelRead(CombinedChannelDuplexHandler.java:243) [netty-transport-4.1.0.CR7.jar:4.1.0.CR7]
    at io.netty.channel.ChannelHandlerInvokerUtil.invokeChannelReadNow(ChannelHandlerInvokerUtil.java:83) [netty-transport-4.1.0.CR7.jar:4.1.0.CR7]
    at io.netty.channel.DefaultChannelHandlerInvoker.invokeChannelRead(DefaultChannelHandlerInvoker.java:154) [netty-transport-4.1.0.CR7.jar:4.1.0.CR7]
    at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:354) [netty-transport-4.1.0.CR7.jar:4.1.0.CR7]
    at io.netty.channel.AbstractChannelHandlerContext.fireChannelRead(AbstractChannelHandlerContext.java:145) [netty-transport-4.1.0.CR7.jar:4.1.0.CR7]
    at io.netty.channel.DefaultChannelPipeline.fireChannelRead(DefaultChannelPipeline.java:1078) [netty-transport-4.1.0.CR7.jar:4.1.0.CR7]
    at io.netty.channel.nio.AbstractNioByteChannel$NioByteUnsafe.read(AbstractNioByteChannel.java:117) [netty-transport-4.1.0.CR7.jar:4.1.0.CR7]
    at io.netty.channel.nio.NioEventLoop.processSelectedKey(NioEventLoop.java:527) [netty-transport-4.1.0.CR7.jar:4.1.0.CR7]
    at io.netty.channel.nio.NioEventLoop.processSelectedKeysOptimized(NioEventLoop.java:484) [netty-transport-4.1.0.CR7.jar:4.1.0.CR7]
    at io.netty.channel.nio.NioEventLoop.processSelectedKeys(NioEventLoop.java:398) [netty-transport-4.1.0.CR7.jar:4.1.0.CR7]
    at io.netty.channel.nio.NioEventLoop.run(NioEventLoop.java:370) [netty-transport-4.1.0.CR7.jar:4.1.0.CR7]
    at io.netty.util.concurrent.SingleThreadEventExecutor$5.run(SingleThreadEventExecutor.java:742) [netty-common-4.1.0.CR7.jar:4.1.0.CR7]
    at io.netty.util.concurrent.DefaultThreadFactory$DefaultRunnableDecorator.run(DefaultThreadFactory.java:145) [netty-common-4.1.0.CR7.jar:4.1.0.CR7]
    at java.lang.Thread.run(Thread.java:745) [na:1.7.0_75]

好像出错在这行代码:EtcdKeysResponse keysResponse = etcdClient.get(listenPath).send().get();

说下我的使用方式: 一个Server项目包含多个接口类(会有几个到十几个Interface),所以我把EtcdRegister实体类的path成员变量由String改成了List,以便能够同时注册多个接口到etcd中

我的疑问如下:

  1. 上面的问题是不是etcdClient不能复用才报错的,如果不能复用,是否需要为每个接口创建一个etcdClient对象

  2. RibbonAlgorithm类能否复用,像我这个场景,那里面创建的线程池、Server源等等一系列东西,岂不是有多份了呀?

原谅我表达的不是很清楚,希望大神能给予解答哈~