在netty中,我如何捕获所有channelClosed事件?

时间:2013-01-09 03:24:57

标签: netty

我们有一个包含大量小请求的HTTP服务,其中大多数只请求一次(约70%)

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

目前我们所做的是注册IdleStateHandler和IdleStateAwareChannelHandler, 这样任何5秒无活动的通道都将被关闭。

这似乎有效,并且打开的频道的大小是稳定的。

但我们还有另一个问题:

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

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

每次检测到channelClosed / exceptionCaught事件时,我们都会调用connectionMap.remove来删除它。

我们在调用IdleStateHandler时手动从地图中删除。

但是有些ServerConnections没有删除,而其Channel的状态实际上已经关闭。

我们错过了什么吗?有没有其他地方关闭频道,但我们忘了赶上活动?

1 个答案:

答案 0 :(得分: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在一些你需要调整的东西上改变了方法名称(它们从getter中删除了get前缀)。