最近我们使用了“-Dorg.jboss.netty.epollBugWorkaround = true”标志来启用java 1.6选择器错误的解决方法。 http://netty.io/news/2012/09/06/3-5-7-final.html
我们认为netty 3.5.10中的解决方法存在一个错误。
当频道未连接时,它会遍历密钥并取消它们。
org.jboss.netty.channel.socket.nio.NioClientSocketPipelineSink.Boss.run()
for (SelectionKey key: selector.keys()) {
SelectableChannel ch = key.channel();
try {
if (ch instanceof SocketChannel && !((SocketChannel) ch).isConnected()) {
notConnected = true;
// cancel the key just to be on the safe side
key.cancel();
}
} catch (CancelledKeyException e) {
}
}
在这种情况下,当未连接通道时,它可能会取消通道连接失败的事件。
我们发现它是因为我们的代码在没有超时的情况下等待连接事件成功/失败(使用“ChannelFutureListener”),并且未返回此事件。 我们的代码依赖于始终返回连接事件,无论是成功还是失败。
您如何看待以下修复?
if (! key.isConnectable() ) {
key.cancel();
}
答案 0 :(得分:1)
我检查了3.5.10的Netty代码。
老板的RegisterTask如下: channel.channel.register(boss.selector,SelectionKey.OP_CONNECT,channel);
不需要key.isConnectable()检查,因为处理的事件是OP_CONNECT。
因此,据我所知,修复程序是删除代码key.cancel();
。
你同意我的意见吗?
答案 1 :(得分:0)
我认为这是有道理的。你能用针对最新3.9树的修复发布PR。