Nettyでの例外
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で入手可能]です。