Nettyでの例外

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();
}

上記のコードスニペットでは、例外メッセージをログに記録し、ChannelHandlerContextclose()も呼び出しています。

これにより、サーバーとクライアント間のチャネルが閉じられます。 基本的に、クライアントを切断して終了させます。

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で入手できます。