下面我演示了如何使用 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
}
}
});
}