web-dev-qa-db-ja.com

Spring Boot @retryableが再試行されない

次のコードは再試行していません。何が欠けていますか?

@EnableRetry
@SpringBootApplication
public class App implements CommandLineRunner
{
    .........
    .........


    @Retryable()
    ResponseEntity<String> authenticate(RestTemplate restTemplate, HttpEntity<MultiValueMap<String, String>> entity) throws Exception
    {
        System.out.println("try!");
        throw new Exception();
        //return restTemplate.exchange(auth_endpoint, HttpMethod.POST, entity, String.class);
    }

以下をpom.xmlに追加しました。

    <dependency>
        <groupId>org.springframework.retry</groupId>
        <artifactId>spring-retry</artifactId>
        <version>1.1.2.RELEASE</version>
    </dependency>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-aop</artifactId>
    </dependency>

また、@ Retryableにさまざまな引数の組み合わせを指定してみました。

@Retryable(maxAttempts=10,value=Exception.class,backoff=@Backoff(delay = 2000,multiplier=2))

ありがとう。

10
engg

スプリングブート2.0.2リリースで、同じクラスに再試行可能で呼び出されたメソッドがある場合、@ Retryableが機能しないことがわかりました。デバッグ時にポイントカットが正しく構築されていないことがわかりました。今のところ、この問題の回避策は、メソッドを別のクラスに記述して呼び出す必要があることです。

動作例は here で見つかります。

10
nkharche

メソッドの@Retryableアノテーションを検出するには、初期化されたコンテキストから正しく呼び出す必要があります。このメソッドは、SpringコンテキストのBeanから呼び出されたものですか、それとも他の方法で呼び出されたものですか?

テストする場合、これはSpringJunit4ClassRunner?を使用するランナーです。

9
UserF40

解決しました。再試行しようとしているメソッドから何かを返す場合、@ Retryable()が機能しないことがわかりました。

pom.xmlのmaven依存関係

    <dependency>
        <groupId>org.springframework.retry</groupId>
        <artifactId>spring-retry</artifactId>
        <version>1.1.5.RELEASE</version>
    </dependency>

Spring boot Application.Java

@SpringBootApplication
@EnableTransactionManagement
@EnableRetry
public class Application {

     public static void main(String[] args) throws Exception {
       SpringApplication.run(Application.class, args);
     }

}

controller.Java

@RestController
public class JavaAllDataTypeController {

@Autowired
JavaAllDataTypeService JavaAllDataTypeService;


@RequestMapping(
        value = "/springReTryTest",
        method = RequestMethod.GET
)
public ResponseEntity<String> springReTryTest() {

    System.out.println("springReTryTest controller");

    try {
         JavaAllDataTypeService.springReTryTest();
    } catch (Exception e) {
        e.printStackTrace();
    }

    return new  ResponseEntity<String>("abcd", HttpStatus.OK);
  }

}

in service.Java

@Service
@Transactional
public class JavaAllDataTypeService {

 // try the method 9 times with 2 seconds delay.
 @Retryable(maxAttempts=9,value=Exception.class,backoff=@Backoff(delay = 2000))
 public void springReTryTest() throws Exception {

    System.out.println("try!");
    throw new Exception();
  }

}

出力:9回試行してから例外をスローします。

enter image description here

5
wahid_cse

戻り値の型でも機能します

@Service
public class RetryService {

private int count = 0;

// try the method 9 times with 2 seconds delay.
@Retryable(maxAttempts = 9, value = Exception.class, backoff = @Backoff(delay = 2000))
public String springReTryTest() throws Exception {
    count++;
    System.out.println("try!");

    if (count < 4)
        throw new Exception();
    else
        return "bla";
  }

}
3
Chinmay Samant

元の質問で説明したのとまったく同じ問題がありました。

私の場合、spring-boot-starter-aop依存関係が誤って含まれていないことがわかりました。私のpom.xmlに追加した後、私の@Retryableメソッドは期待どおりに機能しました。

@Retryableメソッドから値を返すことは、私にとってはうまく機能します。

1
Bas Cancrinus

代替はRetryTemplate

@Bean
    public RetryTemplate retryTemplate() {
        RetryTemplate retryTemplate = new RetryTemplate();

        FixedBackOffPolicy fixedBackOffPolicy = new FixedBackOffPolicy();
        fixedBackOffPolicy.setBackOffPeriod(2000l);
        retryTemplate.setBackOffPolicy(fixedBackOffPolicy);

        SimpleRetryPolicy retryPolicy = new SimpleRetryPolicy();
        retryPolicy.setMaxAttempts(2);
        retryTemplate.setRetryPolicy(retryPolicy);

        return retryTemplate;
    }

そして

retryTemplate.execute(new RetryCallback<Void, RuntimeException>() {
    @Override
    public Void doWithRetry(RetryContext arg0) {
        myService.templateRetryService();
        ...
    }
});

私のためにうまくいきました

ソース

0
BiScOtTiNo