如何在捕获异常后让我的netty处理程序继续读取数据?

时间:2017-12-11 11:04:30

标签: java netty

在我的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继续读取数据?

1 个答案:

答案 0 :(得分:1)

问题实际上是,一旦你处于这种状态,ObjectDecoder将会出现混乱的“解码状态”,因此除了断开连接之外你没有什么可做的。如果您要使用其他消息格式,您可以执行的操作只是丢弃消息的其余部分,并且只有在收到新消息后才会再次开始解析。如何做到这一点真的取决于协议本身。