2017-12-07 6 views
0

私はこのようなインバウンドチャネルハンドラがあるとします。exceptionCaughtのでNetty 4では、ハンドラ内で例外がスローされたときに、参照カウントされたオブジェクトをどのように処理するのですか?

public class Handler extends ChannelInboundHandlerAdapter {                                                     

    @Override                                                                
    protected void channelRead(ChannelHandlerContext ctx, Object msg) throws Exception {                                              
     // msg is actually a reference counted object                                                      
    }                                                                  

    @Override                                                                
    public void exceptionCaught(ChannelHandlerContext ctx, Throwable cause) throws Exception {                                            
     // Handle exception here, can't release msg since it's not passed.                                                 
    }                                                                  
} 

は、その署名にインバウンドメッセージを受信しない参照カウントオブジェクトが解放されることを保証する方法がないように、それはそうです。 channelReadの全内容をtry/catchブロックにラップして、プロセス全体を終了せずに例外を適切に回復できることを確認しているようです。これは本当ですか?

答えて

1

Netty quick start tutorialで示されているように、参照カウントされたオブジェクトをtry-finally内に解放する必要があります。

次のようにこれを行うことができます:私はReferenceCountUtil.release(msg);だけではなくmsg.release()と呼ばれている

public class Handler extends ChannelInboundHandlerAdapter {                                                     

    @Override                                                                
    protected void channelRead(ChannelHandlerContext ctx, Object msg) throws Exception {                                              
     try { 
      // msg is actually a reference counted object 
     } finally { 
      ReferenceCountUtil.release(msg); 
     }                                                  
    }                                                                  

    @Override                                                                
    public void exceptionCaught(ChannelHandlerContext ctx, Throwable cause) throws Exception {                                            
     // Handle exception here, can't release msg since it's not passed.                                                 
    }                                                                  
} 

お知らせ、これは問題のオブジェクトを解放することができた場合、自動的に最初の呼び出しがチェックしていることなぜなら事実であり、一方後者の場合は、オブジェクトを別の型にキャストしてからreleaseメソッドを呼び出す必要があります。

+0

try/finallyで 'channelRead()'メソッド全体をラップする必要がある場合、 'exceptionCaught()'のポイントは何ですか?伝播する例外をキャッチしますか?参照カウント項目を解放する必要がないという要件を持たない他のハンドラメソッドからの例外をキャッチしますか? –

+0

'exceptionCaught'は例外の中心点です。' channelRead'からの例外だけでなく、 'channelWrite'のようなハンドラの他のメソッドや他のハンドラからの例外でも例外がスローされます。あなたは、例外的な苦境への書き込み中に低レベルのNIO例外を投げるようにネティを構成することさえできる。代わりに、 'ChannelInboundHandlerAdapter'ではなく' SimpleChannelInboundHandler'を拡張することができ、それはあなたの参照カウントされたオブジェクトを閉じます – Ferrybig

+0

ところで、もう一度ありがとうございます。申し訳ありません、あまりにも早く投票しませんでした:) –

関連する問題