3

を使用して、Spring Framework ベースのアプリケーションを作成しましたAnnotationConfigApplicationContext

1 つの Bean には、外部サービスへの接続を作成する init メソッドがあります。@PostConstructこれは、Bean が開始されると自動的に実行されるように注釈を付けることができます。

この接続を作成するときに例外を処理するには、例外がキャッチされた場合に init メソッドを最大 5 回再試行する必要があります。メソッドに両方の注釈を付けると@PostConstruct@Retryable例外が1回スローされ、プログラムが終了することがわかります-@Retryable効果がないように見えます。

@EnableRetryと一緒に構成クラスで正しく使用しました@Configuration。再試行可能として注釈が付けられた同じ Bean に別のメソッド B を作成しました。Bean がインスタンス化された後にこのメソッドが呼び出されると、例外がスローされたときにメソッドが再試行され、期待どおりに動作することがわかります。

なぜこれが機能しないのかについての私の考えは、おそらくアスペクトに関連するものであるか、またはスプリング再試行要素がアタッチされる前にポストコンストラクトが発生するのでしょうか?

メソッドでプログラムで試すのではなく、例外を処理し、注釈を介して再試行できる初期化メソッドを持つより良い方法は実際にありますか?

編集: 外部サービスへの接続の作成は 経由で行うべきではないことに同意します@Postconstruct。これにより、再試行が失敗した場合にコンテキスト全体の初期化が停止し、悪影響が生じる可能性があります。

ただし、これは、Spring Framework のどの部分がこれら 2 つのアノテーションを連携させないのかという問題にはまだ答えていません。

4

3 に答える 3

2

ApplicationListenera をリッスンする an を実際に適用し、ContextRefreshedEventこのメソッドに再試行ロジックの注釈を付けることをお勧めします。これらのリスナーは、コンテキストが完全に更新され、すべての Bean が適切に構成および接続されると起動されます。

于 2016-07-03T21:10:59.173 に答える
1

「@Retryable」は、「spring-retry」によって適用されるアスペクトです。これは、Spring コンテキストが完全に作成された後にのみアタッチされます。これは、すべての「@PostConstruct」アノテーション付きメソッドが実行された後であるため、「@Retryable」は効果がありません。

于 2016-07-07T16:01:21.553 に答える