【发布时间】:2013-09-30 11:13:21
【问题描述】:
我有一个配置了相当标准的 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 并使用布尔值关闭,仅在关闭时激活它。但如果可能的话我宁愿避免,似乎有点不必要。
【问题讨论】: