0

以下に、 Netty を使用して接続する方法を示しNioClientSocketChannelFactoryました。Connect は future を返し、接続が成功したか失敗したかを確認できます。

私の理解では、接続プロセスは非ロックであるため、 operationComplete メソッドは netty スレッド (呼び出し元スレッド内ではなく) によって呼び出され、呼び出し元スレッドは終了します。

ほとんどの場合、私が持っているさまざまな Windows 展開で、このように動作します。

しかし、展開の 1 つで、接続が失敗したとき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がどのスレッドに通知されるかを想定しないでください。ほとんどの場合、これはNettyのIOスレッド(ワーカー)になりますが、呼び出し元のスレッドになることもあります。

その場合、なぜそれがあなたのために「戻らない」のか私はまだ理解していません。

于 2012-10-16T04:44:15.057 に答える