2016-09-15 18 views
0

私は注釈ベースのSpringリトライを使用しています。以下は私のインターフェイスです:注釈ベースのSpringリトライを使用して、実行時にインターセプタを動的に変更します

public interface IRetriever 
{ 
     @Retryable(interceptor="RetryInterceptor") 
     public abstract List<Item> retrieve(final LogData transactionLogData, final RetrieveRequestType rqObject) throws InternalException, OpaqueExternalException; 
} 

ダウンストリームサービスを呼び出すためにこのインターフェイスを実装するクラスが3つあります。私はRetryInterceptorsを定義して、各ダウンストリームコールに対して個別の再試行ポリシーを定義できるようにしたいと考えています。本質的には、実行時にRetryInterceptorを変更したいと考えています。

Springで、実行時にRetryInterceptorを変更して、特定のRetryOperationsInterceptorを使用する方法がありますか?

+0

なぜインタフェースでabstractを使用しますか? –

+1

インターセプタはBeanの作成時に作成されます。それを(おそらく可能かもしれないが)変更することは実用的ではない。私はあなたがusecaseの代理再試行インターセプタを要求していると思います。 1つのインターセプターを持ち、そこにサブインターセプターを注入します。インターセプタは、あなたがそのデシジョンを行うことに基づいて正しいものに委任することができます – pandaadb

+0

古いコードです。抽象的なキーワードは廃止されているため、削除する必要があります。 :)。それを指摘してくれてありがとう、私は上記の機能を構築するときにそれを削除します。 – ancoder

答えて

1

インターセプタを(簡単に)変更することはできませんが、実行時にRetryTemplateを変更することができます(setRetryOperations())。

インターセプタのフィールドがvolatileではないため、CPUプロセッサのキャッシュがcliearedされるまで、すべてのスレッドが新しいテンプレートを参照するまでに時間がかかることがあります。

ステートフルリトライを使用している場合、状態は失われます。その場合、既存のテンプレート(インターセプタにある)の再試行ポリシーを変更することができます。

関連する問題