Netty Retry Connect клиент будет зависать - PullRequest
0 голосов
/ 16 апреля 2020

Я пытаюсь создать клиент, который будет повторять попытку подключения при превышении времени ожидания предыдущего подключения. Эта программа пытается подключиться к localhost: 8007, порт 8007 которого не обслуживается, поэтому программа повторит попытку после истечения времени ожидания подключения. Но этот код будет свободен после запуска на некоторое время. Программа зависает при наличии около 3600 потоков. Я ожидаю, что он продолжит повторную попытку, а не замерзнет.

Последним выходом стандартного выхода является «попытка повторного подключения».

Кто-нибудь знает причину, по которой он будет зависать?

JProfiler: статистика потоков программы c, показывает, что 2 потока заблокированы в java .lang.ThreadGroup:

JProfiler, показывает статистику потоков программы c

public final class EchoClient2 {

    static final boolean SSL = System.getProperty("ssl") != null;
    static final String HOST = System.getProperty("host", "127.0.0.1");
    static final int PORT = Integer.parseInt(System.getProperty("port", "8007"));
    static final int SIZE = Integer.parseInt(System.getProperty("size", "256"));

    public static void main(String[] args) throws Exception {
        // Configure SSL.git
        EchoClient2 echoClient2 = new EchoClient2();
        echoClient2.connect();
    }

    public void connect() throws InterruptedException {
        final SslContext sslCtx;

        // Configure the client.
        EventLoopGroup group = new NioEventLoopGroup();
        try {
            Bootstrap b = new Bootstrap();
            b.group(group)
                    .channel(NioSocketChannel.class)
                    .option(ChannelOption.TCP_NODELAY, true)
                    .option(ChannelOption.CONNECT_TIMEOUT_MILLIS, 10)
                    .handler(new ChannelInitializer<SocketChannel>() {
                        @Override
                        public void initChannel(SocketChannel ch) throws Exception {
                            ChannelPipeline p = ch.pipeline();
                            //p.addLast(new LoggingHandler(LogLevel.INFO));
                            p.addLast(new EchoClientHandler());
                        }
                    });

            // Start the client.
            ChannelFuture f = b.connect(HOST, PORT);
            f.addListener(new ConnectionListener());
            System.out.println("add listener");
            f.sync();
            System.out.println("connect sync finish");

            // Wait until the connection is closed.
            f.channel().closeFuture().sync();
            System.out.println("channel close");
        } finally {
            // Shut down the event loop to terminate all threads.
            //group.shutdownGracefully();
        }
    }
}


public class ConnectionListener implements ChannelFutureListener {

    @Override
    public void operationComplete(ChannelFuture channelFuture) throws Exception {

        System.out.println("enter listener");

        EventLoop eventLoop = channelFuture.channel().eventLoop();

        eventLoop.schedule(new Runnable() {
            @Override
            public void run() {
                try {
                    System.out.println("retry connect begin");
                    new EchoClient2().connect();
                    System.out.println("retry connect exit");
                } catch (InterruptedException e) {
                    System.out.println(e);
                    e.printStackTrace();
                }
            }
        }, 10, TimeUnit.MILLISECONDS);

        System.out.println("exit listener");
    }
}
...