복붙노트

[SPRING] 스프링 빈의 기본 클래스에 정의 된 메소드에서 @Retryable 사용은 재 시도되지 않는다.

SPRING

스프링 빈의 기본 클래스에 정의 된 메소드에서 @Retryable 사용은 재 시도되지 않는다.

B 형 스프링 관리 빈이있다 @Configuration 클래스에 @EnableREtry가있다. doStuff ()에서 @Retryable을 사용하면 메서드가 예상대로 실패시 다시 시도됩니다.

그러나, 다시 시도하고 싶은 메소드는 기본 클래스에 정의 된 메소드입니다. A. A는 구체적인 클래스이며 스프링 관리 빈이 아닙니다. doSomethingElse 메서드는 예외를 throw 할 때 다시 시도되지 않습니다.

정말 doSomethingElse가 기본 클래스 방법으로 다시 시도되기를 바랍니다. 그러나, 나는 이것을 어떻게하는지 잘 모릅니다. A는 기본 클래스로 사용되지만 A는 구체적인 클래스이고 Bean이 아니므로 추측하고 있습니다.

A 클래스에서 RetryableTemplate을 사용해야합니까?

public class B extends A {

   public void doStuff() {
      super.doSomethingElse();
   }
}

public class A {
     // doesn't actually retry
    @Retryable
    public void doSomething() {
      throws new Exception();
    }
}

해결법

  1. ==============================

    1.@Retryable은 Spring AOP를 사용하여 구현됩니다.

    @Retryable은 Spring AOP를 사용하여 구현됩니다.

    재 시도 가능한 메소드에 대한 외부 호출 만이 프록시를 통과합니다 (RetryTemplate 내의 메소드를 호출 함). 클래스 내의 내부 호출은 프록시를 우회하므로 재 시도되지 않습니다.

    애플리케이션 컨텍스트에서 프록시에 대한 참조를 얻고이를 호출하거나 doStuff () 메소드 내에서 직접 RetryTemplate을 사용하기위한 트릭을 몇 가지 할 수 있습니다.

  2. from https://stackoverflow.com/questions/41855386/using-retryable-in-methods-define-in-spring-beans-base-class-are-not-retried by cc-by-sa and MIT license