0

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

我的理解是连接过程是非锁定的,所以 operationComplete 方法将由 netty 线程(不在调用者线程内)调用,所以调用者线程将退出。

大多数情况下,在我拥有的各种 Windows 部署中,它都是这样工作的。

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

在我的代码中,当连接失败时,我重新尝试连接(下面未演示)......并且由于它发生在我的调用者线程中,我永远不会从我的连接调用中返回,因为operationComplete在我的调用者线程中调用了。

我究竟做错了什么?注意-无论如何我都没有future.awaitUninterruptibly电话。

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
                    }
                }
        });
}
4

1 回答 1

1

您不应该对通知实际 ChannelFutureListener 的 Thread 做出任何假设。大多数时候这将是 Netty 的 IO-Thread (Worker),但有时这也可以是调用者线程。

我仍然不明白为什么在那种情况下它不会为你“返回”。

于 2012-10-16T04:44:15.057 回答