netty客户端断线重连实现及问题思考

  • 如何监听到客户端和服务端连接断开 ?
  • 如何实现断线后重新连接 ?
  • netty客户端线程给多大比较合理 ?
io.netty.util.concurrent.BlockingOperationException: DefaultChannelPromise@5291d45f(incomplete)
	at io.netty.util.concurrent.DefaultPromise.checkDeadLock(DefaultPromise.java:462) ~[netty-all-4.1.55.Final.jar:4.1.55.Final]
	at io.netty.channel.DefaultChannelPromise.checkDeadLock(DefaultChannelPromise.java:159) ~[netty-all-4.1.55.Final.jar:4.1.55.Final]
	at io.netty.util.concurrent.DefaultPromise.await(DefaultPromise.java:247) ~[netty-all-4.1.55.Final.jar:4.1.55.Final]
	at io.netty.channel.DefaultChannelPromise.await(DefaultChannelPromise.java:131) ~[netty-all-4.1.55.Final.jar:4.1.55.Final]
	at io.netty.channel.DefaultChannelPromise.await(DefaultChannelPromise.java:30) ~[netty-all-4.1.55.Final.jar:4.1.55.Final]
	at io.netty.util.concurrent.DefaultPromise.sync(DefaultPromise.java:404) ~[netty-all-4.1.55.Final.jar:4.1.55.Final]
	at io.netty.channel.DefaultChannelPromise.sync(DefaultChannelPromise.java:119) ~[netty-all-4.1.55.Final.jar:4.1.55.Final]
	at io.netty.channel.DefaultChannelPromise.sync(DefaultChannelPromise.java:30) ~[netty-all-4.1.55.Final.jar:4.1.55.Final]

io.netty.channel.DefaultChannelPromise#checkDeadLock

@Override
protected void checkDeadLock() {
     
    if (channel().isRegistered()) {
     
        super.checkDeadLock();
    }
}

io.netty.util.concurrent.DefaultPromise#checkDeadLock

protected void checkDeadLock() {
     
    EventExecutor e = executor();
    if (e != null && e.inEventLoop()) {
     
        throw new BlockingOperationException(toString());
    }
}

netty客户端断线重连实现及问题思考_第1张图片
io.netty.channel.AbstractChannel.AbstractUnsafe#deregister(io.netty.channel.ChannelPromise, boolean)

@Override
public final void deregister(final ChannelPromise promise) {
     
    assertEventLoop();

    deregister(promise, false);
}

private void deregister(final ChannelPromise promise, final boolean fireChannelInactive) {
     
    if (!promise.setUncancellable()) {
     
        return;
    }

    if (!registered) {
     
        safeSetSuccess(promise);
        return;
    }

    // As a user may call deregister() from within any method while doing processing in the ChannelPipeline,
    // we need to ensure we do the actual deregister operation later. This is needed as for example,
    // we may be in the ByteToMessageDecoder.callDecode(...) method and so still try to do processing in
    // the old EventLoop while the user already registered the Channel to a new EventLoop. Without delay,
    // the deregister operation this could lead to have a handler invoked by different EventLoop and so
    // threads.
    //
    // See:
    // https://github.com/netty/netty/issues/4435
    invokeLater(new Runnable() {
     
        @Override
        public void run() {
     
            try {
     
                doDeregister();
            } catch (Throwable t) {
     
                logger.warn("Unexpected exception occurred while deregistering a channel.", t);
            } finally {
     
                if (fireChannelInactive) {
     
                    pipeline.fireChannelInactive();
                }
                // Some transports like local and AIO does not allow the deregistration of
                // an open channel.  Their doDeregister() calls close(). Consequently,
                // close() calls deregister() again - no need to fire channelUnregistered, so check
                // if it was registered.
                if (registered) {
     
                    registered = false;
                    pipeline.fireChannelUnregistered();
                }
                safeSetSuccess(promise);
            }
        }
    });
}
deregister:792, AbstractChannel$AbstractUnsafe (io.netty.channel)
 fireChannelInactiveAndDeregister:770, AbstractChannel$AbstractUnsafe (io.netty.channel)
  close:753, AbstractChannel$AbstractUnsafe (io.netty.channel)
   close:608, AbstractChannel$AbstractUnsafe (io.netty.channel)
    close:1352, DefaultChannelPipeline$HeadContext (io.netty.channel)
     invokeClose:622, AbstractChannelHandlerContext (io.netty.channel)
      close:606, AbstractChannelHandlerContext (io.netty.channel)
       close:472, AbstractChannelHandlerContext (io.netty.channel)
        exceptionCaught:62, RpcClientHandler (com.zto.zskeeper.client.handler)

netty客户端断线重连实现及问题思考_第2张图片

你可能感兴趣的:(netty)