3

デッドロックを引き起こすテーブルの更新があり、メソッドが何らかのロック例外を取得したときに Spring Retry を再試行しようとしています。maxAttempts、値、およびバックオフを取り出してみましたが、例外をキャッチしていないようです。何か不足していますか?アプリケーション ファイルで Bean を宣言する必要がありますか? どんな助けでも大歓迎です!

アプリケーション.Java

@SpringBootApplication
@EnableRetry
public class Application extends SpringBootServletInitializer {

詳細サービス

@Service
public class DetailService {

    @Retryable(maxAttempts = 5, value = { LockAcquisitionException.class, ConcurrencyFailureException.class }, backoff = @Backoff(delay = 500, multiplier = 2) )
    public void delete(final String detailCode) {
        try {
            this.delete(this.dao.findByDetailCode(detailCode));
        } catch (LockAcquisitionException | ConcurrencyFailureException e) {
            LOG.warn("Locking error! Going to retry", e.getMessage());
            throw e;
        }
    }

    public void delete(Details detail) {
           this.dao.delete(detail);            
    }

    @Retryable(maxAttempts = 5, value = { LockAcquisitionException.class, ConcurrencyFailureException.class }, backoff = @Backoff(delay = 500, multiplier = 2) )
    public void delete(final Integer id) {
        if (id != null) {
            try {
                this.delete(this.dao.findOne(id));
            } catch (LockAcquisitionException | ConcurrencyFailureException e) { 
                 LOG.warn("Locking error! Going to retry", e.getMessage());
                 throw e;
            }
        }
    }

編集

上記の DetailService を書き直して、詳細を提供し、不足しているメソッドを追加しました

4

1 に答える 1

11

delete()メソッド (内) を同じクラス内から呼び出している場合はDetailService、Spring が Bean をラップするプロキシをショートサーキットしています。

アノテーションを持つクラスは Spring 管理の Bean であるdelete()必要があり、メソッドは、オートワイヤリング、インジェクションなどを介して再試行可能な Bean にアクセスできる他の Spring 管理の Bean から呼び出す必要があります。

編集

delete()このクラス内の別のメソッドからメソッドを呼び出す必要がある場合は、アノテーションを使用できませんRetryTemplate。代わりに、適切に構成された を使用してください。

于 2016-08-03T23:40:47.933 に答える