我试图在空闲超时时间之后使用IdleStateHandler关闭来自netty服务器的空闲连接,类似于http://netty.io/3.9/api/org/jboss/netty/handler/timeout/IdleStateHandler.html。 一些它对我不起作用。调试问题并发现Timer在超时后实际触发“IdleStateEvent”事件,在将其添加到队列“AbstractNioSelector.taskQueue”后,它会从“IdleStateHandler.fireChannelIdle”方法中丢失。它在3.5.9.Final中引入,但如果我使用netty 3.5.8.Final版本,则可以正常工作。
我与netty 3.9.x版本绑定,现在使用3.9.4.Final。
受影响的版本:3.5.9。最终到3.9.5.Final
如何重现这一点。 以下代码在1分钟后关闭空闲连接,如果我使用netty 3.5.8.Final,但任何更高的3.x库都不能这样做。
public class PipelineFactory implements ChannelPipelineFactory {
...
public PipelineFactory(Timer timer) {
this.timer = timer;
this.chHandler = new EchoServerHandler();
}
@Override
public ChannelPipeline getPipeline() throws Exception {
final ChannelPipeline pipeline = Channels.pipeline(new IdleStateHandler(this.timer, 0, 0, 60),
new MyIdleStateAwareHandler());
pipeline.addLast("handler", chHandler);
return pipeline;
}
}
class MyIdleStateAwareHandler extends IdleStateAwareChannelHandler {
...
@Override
public void channelIdle(ChannelHandlerContext ctx, IdleStateEvent e) {
if (e.getState() == IdleState.ALL_IDLE) {
logger.info("Closed idle socket.");
e.getChannel().close();
}
}
}
class EchoServerHandler extends SimpleChannelHandler {
...
@Override
public void messageReceived(ChannelHandlerContext ctx, MessageEvent e) throws Exception {
try {
Thread.sleep(600000);
}
catch(InterruptedException iex) {
logger.error("interrupted " + iex.getMessage());
}
ChannelBuffer buffer = (ChannelBuffer) e.getMessage();
while(buffer.readable()) {
System.out.print((char) buffer.readByte());
System.out.flush();
}
}
}
非常感谢您解决此问题的任何帮助或指示。
答案 0 :(得分:0)
请打开问题跟踪器的错误报告。谢谢!