1

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

4

1 回答 1

2

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

于 2013-09-25T04:52:58.567 回答