Spring 中的@Retryable 注释不会触发重试
@Retryable annotation in Spring Retry will not fire
我有一个导致死锁的 table 更新,我正在尝试获取 Spring 重试,以便在该方法获得某种锁定异常时重试。我试过去掉 maxAttempts、value 和 backoff,但它似乎从未捕捉到任何异常。我错过了什么吗?我需要在应用程序文件中声明一个 bean 吗?任何帮助将不胜感激!
Application.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 以提供更多细节并添加缺失的方法
如果您从同一个 class 中调用 delete()
方法(在 DetailService
中),您就是在短路 Spring 包装豆入.
具有注解的 class 必须是一个 Spring-managed bean 并且 delete()
方法必须从其他一些具有注解的 Spring-managed bean 调用通过自动装配、注入等方式访问可重试 bean
编辑
如果您需要从这个 class 中的另一个方法调用 delete()
方法,您不能使用注释 - 请改用适当配置的 RetryTemplate
。
我有一个导致死锁的 table 更新,我正在尝试获取 Spring 重试,以便在该方法获得某种锁定异常时重试。我试过去掉 maxAttempts、value 和 backoff,但它似乎从未捕捉到任何异常。我错过了什么吗?我需要在应用程序文件中声明一个 bean 吗?任何帮助将不胜感激!
Application.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 以提供更多细节并添加缺失的方法
如果您从同一个 class 中调用 delete()
方法(在 DetailService
中),您就是在短路 Spring 包装豆入.
具有注解的 class 必须是一个 Spring-managed bean 并且 delete()
方法必须从其他一些具有注解的 Spring-managed bean 调用通过自动装配、注入等方式访问可重试 bean
编辑
如果您需要从这个 class 中的另一个方法调用 delete()
方法,您不能使用注释 - 请改用适当配置的 RetryTemplate
。