を使用して、Spring Framework ベースのアプリケーションを作成しましたAnnotationConfigApplicationContext
。
1 つの Bean には、外部サービスへの接続を作成する init メソッドがあります。@PostConstruct
これは、Bean が開始されると自動的に実行されるように注釈を付けることができます。
この接続を作成するときに例外を処理するには、例外がキャッチされた場合に init メソッドを最大 5 回再試行する必要があります。メソッドに両方の注釈を付けると@PostConstruct
、@Retryable
例外が1回スローされ、プログラムが終了することがわかります-@Retryable
効果がないように見えます。
@EnableRetry
と一緒に構成クラスで正しく使用しました@Configuration
。再試行可能として注釈が付けられた同じ Bean に別のメソッド B を作成しました。Bean がインスタンス化された後にこのメソッドが呼び出されると、例外がスローされたときにメソッドが再試行され、期待どおりに動作することがわかります。
なぜこれが機能しないのかについての私の考えは、おそらくアスペクトに関連するものであるか、またはスプリング再試行要素がアタッチされる前にポストコンストラクトが発生するのでしょうか?
メソッドでプログラムで試すのではなく、例外を処理し、注釈を介して再試行できる初期化メソッドを持つより良い方法は実際にありますか?
編集: 外部サービスへの接続の作成は 経由で行うべきではないことに同意します@Postconstruct
。これにより、再試行が失敗した場合にコンテキスト全体の初期化が停止し、悪影響が生じる可能性があります。
ただし、これは、Spring Framework のどの部分がこれら 2 つのアノテーションを連携させないのかという問題にはまだ答えていません。