Spring 4 - Spring重试1.2.1.RELEASE @Recover无法正常工作

时间:2018-05-01 19:36:42

标签: spring spring-4 spring-retry

我创建了一个adapterImpl类,它将使用objA重试一个方法,但是如果它抛出异常(硬编码为throw),它将调用recover方法 - 它将再次使用objB调用该方法。

我的问题是 - 未调用@Recover方法。我不确定我在这里做错了什么。

Spring版本 - 4.3.5.RELEASE

Spring重试 - 1.2.1.RELEASE

我的配置类 -

@Configuration
@EnableRetry
public class ConfigClass {

@Bean
public ClassTest beanA(){
    ClassTest obj = new ClassTest();
    obj.setProp(5);
    return obj;
}

@Bean
public ClassTest beanB(){
    ClassTest obj = new ClassTest();
    obj.setProp(10);
    return obj;
}

@Bean("adapterImpl")
public AdapterInterfaceImpl adapter(){
    AdapterInterfaceImpl obj = new AdapterInterfaceImpl();
    return obj;
}
}

我的AdapterInterfaceImpl类 -

public class AdapterInterfaceImpl implements AdapterInterface{

@Autowired
@Qualifier("beanA")
private ClassTest objA;

@Autowired
@Qualifier("beanB")
private ClassTest objB;


public ClassTest getObjA() {
    return objA;
}


public void setObjA(ClassTest objA) {
    this.objA = objA;
}


public ClassTest getObjB() {
    return objB;
}


public void setObjB(ClassTest objB) {
    this.objB = objB;
}


@Retryable(maxAttempts = 3, include = Exception.class, backoff = @Backoff(delay = 2000))
public int getValue(int val) throws Exception{
    System.out.println("obj A get Value");
    return getValue(objA,val);
}


public int getValue(ClassTest obj, int val) throws Exception{
    System.out.println("get Value");
    if(obj==objA){
        throw new Exception("This is msg");
    }
    return obj.methodA(val);
}

@Recover
public int getValue(Exception e, int val){
    System.out.println("Recover get Value");
    try{
        return getValue(objB,val);
    }catch(Exception e1){
        return 0;
    }           
}

我的ClassTest课程 -

public class ClassTest {
private int prop;

public int getProp() {
    return prop;
}

public void setProp(int prop) {
    this.prop = prop;
}

public int methodA(int x){
    return x+prop;
}

}

我的班级主要方法 -

public class App 
{   
public static void main( String[] args )
{
    AbstractApplicationContext context = new 
    AnnotationConfigApplicationContext(ConfigClass.class);
    AdapterInterface adapter = (AdapterInterface) 
    context.getBean("adapterImpl");
    try {
        System.out.println(adapter.getValue(3));
    } catch (Exception e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }
}
}

我的输出未显示任何重试或恢复 -

 A get Value
 get Value
 obj A get Value
 get Value
 obj A get Value
 get Value
 org.springframework.retry.ExhaustedRetryException: Cannot locate recovery method; nested exception is java.lang.Exception: This is msg

2 个答案:

答案 0 :(得分:1)

Spring Retry使用AOP,内部调用(从getValue(int)getValue(ClassTest, int))不会通过代理。

您必须将@Retryable放在外部调用的方法上,以便代理可以拦截调用并应用重试逻辑。

答案 1 :(得分:0)

https://github.com/spring-projects/spring-retry/issues/75

中报告了类似的问题

所以@EnableRetry(proxyTargetClass=true)正常工作,因为它现在能够在实现类中找到恢复方法。