编辑:一切正常。问题完全在另一边。这可以用作一个工作示例。
我正在尝试在我的服务器中使用 Netty 4.0.9 实现 IdleStateHandler。我遇到的问题是它不会触发 IdleStateEvent。
为了测试,我只是让客户端“崩溃”,就像我对 OIO 所做的那样(并且在这种情况下一切都按预期工作)。
我确定我在任何地方都没有阻塞,一切正常(包括来自客户端的正常关闭连接请求)。
这是我的代码...管道
public PipelineInitializer(){
super();
}
@Override
protected void initChannel(SocketChannel ch) throws Exception {
// Idle Handlers
ch.pipeline().addLast("IdleChecker", new IdleStateHandler(15,0,0));
ch.pipeline().addLast("IdleDisconnecter", new IdleDisconnecter());
// Decoding Handlers
ch.pipeline().addLast("Framer", new DelimiterBasedFrameDecoder(Integer.MAX_VALUE, Delimiters.lineDelimiter()));
ch.pipeline().addLast("Decoder", STR_DECODER);
// Encoding Handlers
ch.pipeline().addLast("Encoder", STR_ENCODER);
// Processing Handlers (if Idle Event, disconnects)
ch.pipeline().addLast("ServiceSelector", new ServiceSelector());
}
以及应该处理 IdleEvent 的 Handler:
public class IdleDisconnecter extends ChannelDuplexHandler {
public IdleDisconnecter(){
super();
}
@Override
public void userEventTriggered(ChannelHandlerContext ctx, Object evt) throws Exception{
System.out.println("Event Fired"); // Doesn't trigger
if (evt instanceof IdleStateEvent) {
System.out.println("Event is IdleStateEvent"); // Doesn't trigger
if (((IdleStateEvent) evt).state() == IdleState.READER_IDLE) {
System.out.println("Event is a Reader one"); // Doesn't trigger
throw new Exception(); //I want this to be catch by the last handler in the pipeline
}
}
}
有什么建议吗?可能我犯了一些我拒绝看到的愚蠢错误,我不知道,但我完全没有想法。
谢谢