2017-12-11 10 views
0

私のnettyハンドラでは、例外キャッシュメソッドをにオーバーライドし、Netty ObjectDecoderによってスローされたTooLongFrameExceptionをキャッチします。 その例外の場合は、そのエラーに関する情報を含むメッセージをサーバーに送信します。 サーバーはそのメッセージを受信し、次にさらにデータを送信しようとします。問題は、私のハンドラがそのデータを読み続けるように見えないことです。例外をキャッチした後にNettyハンドラがデータを読み続けるようにするにはどうすればよいですか?

私はどのように私はネッティーObjectDecoderによってスローされた例外をキャッチした後、私のハンドラは、データを読み続けることができますか?ネッティー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); 
    } 
} 

を使用

答えて

1

この状態になると、「ObjectDecoder」には「デコード状態」が乱れてしまいます。そのため、接続を削除することはあまりありません。別のメッセージフォーマットを使用する場合は、メッセージの残りの部分を破棄し、新しいメッセージを受け取った後に初めて解析を開始するだけです。どのようにこれを行うことができるかなどは、実際にプロトコル自体に依存します。

関連する問題