修改Netty ServerBootstrap ChannelInitializer

时间:2013-09-25 02:19:07

标签: java netty

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

1 个答案:

答案 0 :(得分:2)

目前无法在运行时“替换”初始化程序。所以使用旗帜等将是最好的选择。