为什么在调用者线程中调用netty客户端连接future.operationComplete?

时间:2012-10-15 23:05:25

标签: java tcp netty nonblocking

下面我演示了如何使用Netty NioClientSocketChannelFactory进行连接。 Connect返回未来,我可以检查是否 连接成功/失败。

我的理解是连接过程是非锁定的,因此netCo thread将调用operationComplete方法(不在调用者线程内),因此调用者线程将退出。

大部分时间它以这种方式工作,在我拥有的各种Windows部署上。

但是在其中一个部署中,我注意到当连接失败时,在我的调用者线程而不是netty线程中调用operationComplete方法。 抛出的异常也会在调用者线程中被捕获。我没想到这一点。

在我的代码中,当连接失败时,我重新尝试连接(下面没有演示)...并且因为它发生在我的调用者线程中,所以我从来没有从我的连接调用返回,因为 在我的调用者线程中调用operationComplete

我做错了什么?注意 - 我没有future.awaitUninterruptibly调用anywhwere。

public static void main(String[] args)
{
        String host = "localhost";
        int port = 5555;
        ChannelFactory factory = new NioClientSocketChannelFactory(Executors
                        .newCachedThreadPool(), Executors.newCachedThreadPool());
        MyHandler handler = new MyHandler();
        PipelineFactory factory = new PipelineFactory(handler);
        ClientBootstrap bootstrap = new ClientBootstrap(factory);
        ChannelFuture future = bootstrap.connect(new InetSocketAddress(host, port));

        future.addListener(new ChannelFutureListener()
        {
                @Override
                public void operationComplete(ChannelFuture future) throws Exception
                {
                    if (future.isSuccess()) {
                        // SUCCESS
                    }
                    else
                    {
                        // FAILURE
                    }
                }
        });
}

1 个答案:

答案 0 :(得分:1)

您不应该在哪个Thread中通知实际的ChannelFutureListener。大多数情况下,这将是Netty的IO-Thread(Worker),但有时这也可能是调用者Thread。

在这种情况下,我仍然不明白为什么它不会“回归”。