在我的netty处理程序中,我将exceptionCaught方法重写为捕获由netty ObjectDecoder 引发的TooLongFrameException。 在该异常的情况下,我向服务器发送一条消息,其中包含有关该错误的信息。 服务器接收该消息,然后尝试继续发送更多数据。问题是,我的处理程序似乎没有继续读取该数据。
我使用netty 4.1.18.Final
import io.netty.channel.SimpleChannelInboundHandler;
import io.netty.handler.codec.TooLongFrameException;
public final class MyHandler extends SimpleChannelInboundHandler<MyObject> {
@Override
protected void channelRead0(ChannelHandlerContext channelHandlerContext, MyObject obj) throws Exception {
}
@Override
public void exceptionCaught(ChannelHandlerContext ctx, Throwable cause) throws Exception {
if (cause instanceof TooLongFrameException) {
ctx.writeAndFlush( messageAboutError );
return;
} else
ctx.writeAndFlush( messageAboutUnexpectedError );
super.exceptionCaught(ctx, cause);
}
}
在捕获netty ObjectDecoder引发的异常后,如何让Handler继续读取数据?
答案 0 :(得分:1)
问题实际上是,一旦你处于这种状态,ObjectDecoder
将会出现混乱的“解码状态”,因此除了断开连接之外你没有什么可做的。如果您要使用其他消息格式,您可以执行的操作只是丢弃消息的其余部分,并且只有在收到新消息后才会再次开始解析。如何做到这一点真的取决于协议本身。