我们已经实现了以下channelIdle
实现。
public void channelIdle(ChannelHandlerContext ctx, IdleStateEvent e)
throws Exception {
Response response = business.getResponse();
final Channel channel = e.getChannel();
ChannelFuture channelFuture
= Channels.write(
channel,
ChannelBuffers.wrappedBuffer(response.getXML().getBytes())
);
if (response.shouldDisconnect()) {// returns true and listener _is_ added.
channelFuture.addListener(new ChannelFutureListener() {
@Override
public void operationComplete(ChannelFuture future) throws Exception {
channel.close(); // never gets called :(
}
});
}
}
在非 SSL 模式下运行时,这将按预期工作。
但是,在启用 SSL 的情况下运行时,该operationComplete
方法永远不会被调用。我们已经在各种机器上验证了几次。空闲超时发生了很多次,但operationComplete
没有被调用。我们没有看到任何异常被抛出。
我已经尝试跟踪代码以查看operationComplete
应该在哪里调用,但它很复杂,我还没有完全弄清楚。
有电话future = succeededFuture(channel);
进来,SslHandler.wrap()
但我不知道这是否意味着什么。从返回的未来wrap
永远不会在SslHandler
代码的其他地方使用。