1概要

このクイック記事では、Nettyでの例外処理について説明します。

簡単に言うと、Nettyは高性能の非同期およびイベント駆動型のネットワークアプリケーションを構築するためのフレームワークです。 I/O操作は、ライフサイクル内でコールバックメソッドを使用して処理されます。

フレームワークとそれを始める方法についてのより多くの詳細は私達の前のリンクで見つけることができます:/netty[ここの記事]。


2 Netty

での例外処理

前述のように、

Nettyはイベント駆動型システムで、特定のイベントに対するコールバックメソッドを持っています。例外もそのようなイベントです。

クライアントから受け取ったデータの処理中または入出力操作中に例外が発生する可能性があります。これが起こると、専用の例外キャッチイベントが発生します。


2.1. 生成元チャネルでの例外処理

  • 発生した例外キャッチイベントは、

    ChannelInboundHandler

    またはそのアダプタとサブクラスの__exceptionsCaught()メソッドによって処理されます。

コールバックは

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

が呼び出されます。


ChannelHandlerA

のコードスニペットを修正して、

ctx.fireExceptionCaught()

を呼び出してイベントを伝播します。

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で例外を処理する方法と、必要に応じて例外を伝播する方法について説明しました。

完全なソースコードはhttps://github.com/eugenp/tutorials/tree/master/libraries-server[Githubで入手可能]です。