Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/spring-boot/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java @Spring重试中的可重试批注将不会触发_Java_Spring Boot_Spring Retry - Fatal编程技术网

Java @Spring重试中的可重试批注将不会触发

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的代理短路 具有注释的类

我有一个导致死锁的表更新,我试图让Spring在方法得到某种类型的锁定异常时重试。我尝试过去掉maxtures、value和backoff,但它似乎从来没有捕捉到任何异常。我错过什么了吗?我需要在应用程序文件中声明bean吗?任何帮助都将不胜感激

Application.Java 详细服务 编辑
重写上面的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;
            }
        }
    }