かなり標準的な Http-Codec ChannelInitializer で構成された ServerBootstrap があります。
シャットダウン時に、サーバーは受信リクエストを引き続き処理できる猶予期間を待ちます。私のサーバーはキープアライブをサポートしていますが、シャットダウン時に、送信されたすべての HttpResponse が HTTP ヘッダー "Connection: close" で接続を閉じ、書き込み後にチャネルが閉じられるようにしたいと考えています。これは、サーバーのシャットダウン時にのみ必要です。
それをサポートする ChannelHandler があります。
@ChannelHandler.Sharable
public class CloseConnectionHandler extends ChannelOutboundHandlerAdapter {
@Override
public void write(ChannelHandlerContext ctx, Object msg, ChannelPromise promise) throws Exception {
HttpResponse response = (HttpResponse) msg;
if (isKeepAlive(response)) {
setKeepAlive(response, false);
promise.addListener(ChannelFutureListener.CLOSE);
}
ctx.write(msg, promise);
}
ChannelGroup を使用して、接続されているすべてのクライアントを追跡しているため、シャットダウンの時点で各クライアントのパイプラインを動的に変更して、CloseConnectionHandler を含めることができます。これは問題なく機能します。
ただし、猶予期間中の新しい接続には、元の ServerBootstrap ChannelInitializer によって提供されるパイプライン構成があり、それを動的に再構成する方法がわかりませんか?
回避策として、CloseConnectionHandler を標準パイプラインで構成し、ブール値でオフにして、シャットダウン時にのみアクティブにすることができます。しかし、可能であればそれは避けたいと思いますが、少し不必要に思えます。