今回も備忘録です。
このドキュメントについて
下記について記載していきます。
・非同期処理中の共通のエラーハンドラ実装について
非同期処理中はexceptionをthrowしても、下記記事で記載した@ExceptionHandlerでは処理されないので、非同期用のエラーハンドラが必要です。
実行環境
・Java17
・springboot 3.0.2
実装
@Slf4j
@Component
public class AsyncExceptionHandler extends AsyncConfigurerSupport {
@Override
public AsyncUncaughtExceptionHandler getAsyncUncaughtExceptionHandler() {
return (e, method, params) -> {
if (e instanceof ExampleException) {
log.warn(e.getMessage(), e);
} else if (e instanceof ExampleException2) {
log.error(e.getMessage(), e);
} else {
log.error(e.getMessage(), e);
}
};
}
}
説明:
- AsyncUncaughtExceptionHandlerインターフェースのhandleUncaughtExceptionメソッドをオーバーライドして、処理の内容を書き込み、AsyncUncaughtExceptionHandlerを実現したクラスをDIコンテナに登録してあげる必要がある。
→登録しておくことで、非同期処理中に発生したExceptionを勝手に拾ってくれるようになる?
2.エラーが起きた箇所のメソッドやパラメータなど細かく引数で受け取れるが、今回はエラーメッセージとスタックトレースをログに残したかったので、exceptionごとにログレベルの異なるログを出力するようにした。
※AsyncConfigurerインターフェースを実現するでも可能
(spring 6.0以降のバージョンではAsyncConfigurerの直接実現が推奨らしい)
まとめ
非同期中でもどこでどうゆうエラーが起きたのかちゃんとログに残してあげたり、
アラートを出すべきエラーとそうでないエラーなどを分けることもできるので、
後から調査が楽になるのではと思います。