Netty Channel.close()偶尔会挂起。在我们的特定用例中,我们有一个通道池,我们的测试检查网络故障的容忍度。因此,在我们的测试中,我们尝试关闭一个频道。
在下面的代码片段中,我们在调用Channel.close()之前,紧跟在Channel.close()之后和ChannelFuture.await()之后打印调试语句。为了确保线程没有被中断,我们检查InterruptedException。
Channel c = partitionChannelMap.get(partition);
if (c != null) {
for (int retries = 0; retries < numRetries; retries++) {
try {
logger.debug("Attempt {}: Closing channel to partition {}", retries + 1, partition);
logger.debug("Channel Properties - isBound() isConnected() isOpen() " + c.isBound() + " "
+ c.isConnected() + " " + c.isOpen());
ChannelFuture closeFuture = c.close();
logger.debug("About to wait");
closeFuture.await(nettyTimeout);
if (closeFuture.isSuccess()) {
logger.debug("Attempt {}: CLOSED channel to partition {}", retries + 1, partition);
partitionChannelMap.remove(partition);
break;
} else {
logger.error("Attempt {}: FAILED to close partition {}", retries + 1, partition);
continue;
}
} catch (InterruptedException e) {
logger.error("Attempt {}: FAILED to close partition {}", retries + 1, partition);
e.printStackTrace();
continue;
}
}
}
}
在某些运行(错误的运行)中,执行Channel.close()之前的调试语句,而不执行之后的调试语句。由于Channel.close()是异步的,我们期望它立即返回。在这些情况下,执行在调用Channel.close()。
后挂起我在这里假设或做错了吗?
错误执行的示例输出 -
15:12:32.497 [Thread-7] DEBUG org.apache.s4.comm.tcp.TCPEmitter - Attempt 1: Closing channel to partition 0
15:12:32.497 [Thread-7] DEBUG org.apache.s4.comm.tcp.TCPEmitter - Channel Properties - isBound() isConnected() isOpen() true true true
我真的很感激任何帮助。
由于
答案 0 :(得分:0)
问题在于我的代码。
我在同步块中调用Channel.close()。 close()会干扰并发传输的消息传输,并异步调用失败传输的operationComplete()。碰巧的是,operationComplete()处理程序也试图关闭同一个通道,导致死锁。