Java @Spring重试中的可重试批注将不会触发
我有一个导致死锁的表更新,我试图让Spring在方法得到某种类型的锁定异常时重试。我尝试过去掉maxtures、value和backoff,但它似乎从来没有捕捉到任何异常。我错过什么了吗?我需要在应用程序文件中声明bean吗?任何帮助都将不胜感激 Application.Java 详细服务 编辑Java @Spring重试中的可重试批注将不会触发,java,spring-boot,spring-retry,Java,Spring Boot,Spring Retry,我有一个导致死锁的表更新,我试图让Spring在方法得到某种类型的锁定异常时重试。我尝试过去掉maxtures、value和backoff,但它似乎从来没有捕捉到任何异常。我错过什么了吗?我需要在应用程序文件中声明bean吗?任何帮助都将不胜感激 Application.Java 详细服务 编辑 重写上面的my DetailService以提供更多细节并添加缺少的方法如果从同一个类中调用delete()方法(在DetailService中),则会使Spring封装bean的代理短路 具有注释的类
重写上面的my DetailService以提供更多细节并添加缺少的方法如果从同一个类中调用
delete()
方法(在DetailService
中),则会使Spring封装bean的代理短路
具有注释的类必须是一个Spring托管bean,并且必须从其他Spring托管bean调用delete()
方法,该bean可以通过自动连接、注入等方式访问可检索bean
编辑
如果需要从此类中的另一个方法调用
delete()
方法,则不能使用注释-而是使用适当配置的RetryTemplate
。如果要从同一类中调用delete()
方法(在DetailService
中),您正在短路Spring将bean封装在其中的代理
具有注释的类必须是一个Spring托管bean,并且必须从其他Spring托管bean调用delete()
方法,该bean可以通过自动连接、注入等方式访问可检索bean
编辑
如果需要从此类中的另一个方法调用
delete()
方法,则不能使用注释-而是使用适当配置的RetryTemplate
。delete()方法是自动连接的dao类的一部分。dao是一个crud存储库类。抱歉,这里没有包括整个DetailService类。这还会使代理短路吗?哦,对不起,误解了。不,这不是在同一个类中调用的。它正在从控制器或其他服务调用No;我指的是这个类中的delete()
方法(带注释的方法)。请参阅我的编辑以了解其他解决方法。如果设置了断点,则应在控制器和此类之间的调用堆栈中看到代理和RetryTemplate;如果没有,那么接线有问题。我昨晚搞错了,delete()
被类中的另外两个方法调用。如果我把@Retryable
放在那些方法上,那会起作用吗?还是我需要编写自己的RetryTemplate?我试图避免编写我自己的…delete()方法是自动连接的dao类的一部分。dao是一个crud存储库类。抱歉,这里没有包括整个DetailService类。这还会使代理短路吗?哦,对不起,误解了。不,这不是在同一个类中调用的。它正在从控制器或其他服务调用No;我指的是这个类中的delete()
方法(带注释的方法)。请参阅我的编辑以了解其他解决方法。如果设置了断点,则应在控制器和此类之间的调用堆栈中看到代理和RetryTemplate;如果没有,那么接线有问题。我昨晚搞错了,delete()
被类中的另外两个方法调用。如果我把@Retryable
放在那些方法上,那会起作用吗?还是我需要编写自己的RetryTemplate?我想避免写我自己的文章。。。
@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;
}
}
}