我有一个配置了相当标准的Http-Codec ChannelInitializer的ServerBootstrap。
关闭时,我的服务器会等待一段宽限期,它仍可以处理传入的请求。我的服务器支持keep-alive,但是在关机时我想确保每个发送的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并使用布尔值关闭,仅在关闭时激活它。但我宁愿避免这种情况,如果可能的话,似乎有点不必要。
答案 0 :(得分:2)
目前无法在运行时“替换”初始化程序。所以使用旗帜等将是最好的选择。