Nettyの例外
1. 概要
この簡単な記事では、Nettyでの例外処理について説明します。
簡単に言えば、Nettyは高性能の非同期およびイベント駆動型ネットワークアプリケーションを構築するためのフレームワークです。 I/O operations are handled inside its life-cycle using callback methods.
フレームワークとその使用を開始する方法の詳細については、以前のarticle hereを参照してください。
2. Nettyでの例外の処理
前述のように、Netty is an event-driven system and has callback methods for specific events. Exceptions are such events too.
例外は、クライアントから受信したデータの処理中またはI / O操作中に発生する可能性があります。 これが発生すると、専用の例外キャッチイベントが発生します。
2.1. 発信元のチャネルでの例外の処理
ChannelInboundHandlerまたはそのアダプターとサブクラスのThe exception-caught event, when fired, is handled by the exceptionsCaught() method。
コールバックはChannelHandlerインターフェースで非推奨になっていることに注意してください。 現在はChannelInboudHandlerインターフェースに限定されています。
このメソッドは、ThrowableオブジェクトとChannelHandlerContextオブジェクトをパラメーターとして受け入れます。 Throwableオブジェクトは、スタックトレースを出力したり、ローカライズされたエラーメッセージを取得したりするために使用できます。
それでは、チャネルハンドラーChannelHandlerAを作成し、そのexceptionCaught()を実装でオーバーライドしましょう。
public void exceptionCaught(ChannelHandlerContext ctx, Throwable cause)
throws Exception {
logger.info(cause.getLocalizedMessage());
//do more exception handling
ctx.close();
}
上記のコードスニペットでは、例外メッセージをログに記録し、ChannelHandlerContextのclose()も呼び出しています。
これにより、サーバーとクライアント間のチャネルが閉じられます。 基本的に、クライアントを切断して終了させます。
2.2. 例外の伝播
前のセクションでは、発生元のチャネルで例外を処理しました。 ただし、実際に例外をパイプライン内の別のチャネルハンドラーに伝達できます。
エラーメッセージをログに記録してctx.close()を呼び出す代わりに、ChannelHandlerContextオブジェクトを使用して、別の例外キャッチイベントを手動で発生させます。
これにより、パイプライン内の次のチャネルハンドラーのexceptionCaught()が呼び出されます。
ctx.fireExceptionCaught()を呼び出してイベントを伝播するように、ChannelHandlerAのコードスニペットを変更してみましょう。
public void exceptionCaught(ChannelHandlerContext ctx, Throwable cause)
throws Exception {
logger.info("Exception Occurred in ChannelHandler A");
ctx.fireExceptionCaught(cause);
}
さらに、別のチャネルハンドラーChannelHandlerBを作成し、そのexceptionCaught()を次の実装でオーバーライドしてみましょう。
@Override
public void exceptionCaught(ChannelHandlerContext ctx, Throwable cause)
throws Exception {
logger.info("Exception Handled in ChannelHandler B");
logger.info(cause.getLocalizedMessage());
//do more exception handling
ctx.close();
}
Serverクラスでは、チャネルは次の順序でパイプラインに追加されます。
ch.pipeline().addLast(new ChannelHandlerA(), new ChannelHandlerB());
例外が捕捉されたイベントを手動で伝播することは、すべての例外が1つの指定されたチャネルハンドラーによって処理されている場合に役立ちます。
3. 結論
このチュートリアルでは、コールバックメソッドを使用してNettyで例外を処理する方法と、必要に応じて例外を伝播する方法について説明しました。
完全なソースコードはover on Githubで入手できます。