我有一个配置了相当标准的 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 并使用布尔值关闭,仅在关闭时激活它。但如果可能的话,我宁愿避免这种情况,这似乎有点不必要。