以下に、 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
}
}
});
}