下面我演示了如何使用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
}
}
});
}
答案 0 :(得分:1)
您不应该在哪个Thread中通知实际的ChannelFutureListener。大多数情况下,这将是Netty的IO-Thread(Worker),但有时这也可能是调用者Thread。
在这种情况下,我仍然不明白为什么它不会“回归”。