以下の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);
inへの呼び出しがありますが、SslHandler.wrap()
それが何かを意味するかどうかはわかりません。から返される未来は、コードwrap
の他の場所で使用されることはありません。SslHandler