2

我们有一个 HTTP 服务有大量的小请求,而且大部分只请求一次(大约 70%)

因此,如果我们在请求到来时保持通道打开,很快就会有很多通道留在内存中而什么都不做。

目前我们做的是注册一个 IdleStateHandler 和一个 IdleStateAwareChannelHandler,这样任何一个 5 秒内没有活动的通道都会被关闭。

这似乎行得通,并且打开的渠道的大小是稳定的。

但是我们还有另一个问题:

对于每个打开的频道,我们都自定义了与之关联的 ServerConnection 对象,以存储与当前频道相关的一些有用信息。我们将这些 ServerConnection 保存在一个名为 connectionMap 的全局映射中,键是通道。

每次调用messageReceived时,我们检查channel是否已经在connectionMap中,如果没有,则创建一个新的ServerConnection。

每次检测到 channelClosed/exceptionCaught 事件时,我们调用 connectionMap.remove 将其移除。

当 IdleStateHandler 被调用时,我们手动从地图中移除。

但是有些 ServerConnections 并没有被移除,而它的 Channel 的状态实际上是关闭的。

我们错过了什么吗?是否还有其他地方关闭了 Channel,但我们忘记了捕捉事件?

4

1 回答 1

4

您可以在频道关闭时收到通知,方法是使用ChannelFutureListener界面并注册频道的关闭未来。

class MyClass implements ChannelFutureListener
{
    // Whatever stuff this class also does 
    // ...

    public void operationComplete(ChannelFuture future) throws Exception
    {
        System.out.println("This channel closed! " + 
                           future.getChannel().getId().toString());
    }

}

然后对于您的频道,您会...

channel.getCloseFuture().addListener(instanceOfMyClass); 

当频道关闭时,您ChannelFutureListener会收到通知。

请注意,这是 Netty 3.x。Netty 4.x 更改了一些您需要调整的方法名称(他们get从 getter 中删除了前缀)。

于 2013-01-09T03:41:57.587 回答