我们有一个包含大量小请求的HTTP服务,其中大多数只请求一次(约70%)
因此,如果我们在请求到来时保持一个频道开放,很快就会有很多频道留在内存中而什么都不做。
目前我们所做的是注册IdleStateHandler和IdleStateAwareChannelHandler, 这样任何5秒无活动的通道都将被关闭。
这似乎有效,并且打开的频道的大小是稳定的。
但我们还有另一个问题:
对于每个打开的频道,我们都有与之关联的自定义ServerConnection对象, 存储一些与当前频道相关的有用信息。我们将这些ServerConnection保存在名为connectionMap的全局映射中,其中键是通道。
每次调用messageReceived时,我们都会检查该通道是否已经在connectionMap中,如果没有,则会创建一个新的ServerConnection。
每次检测到channelClosed / exceptionCaught事件时,我们都会调用connectionMap.remove来删除它。
我们在调用IdleStateHandler时手动从地图中删除。
但是有些ServerConnections没有删除,而其Channel的状态实际上已经关闭。
我们错过了什么吗?有没有其他地方关闭频道,但我们忘了赶上活动?
答案 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
前缀)。