春季重试,以后的任务不起作用

时间:2019-04-07 09:36:05

标签: spring spring-boot java-8 spring-retry futuretask

我有一个spring-boot应用程序,该应用程序需要调用外部API。 如果有“ n”个外部呼叫,则将创建“ n”个以后的任务,并进行其余呼叫。这里的问题是,如果任何剩余呼叫都失败,但异常,我需要重试该呼叫3次。 我试过使用Spring-try,但不会尝试失败。

以下是到目前为止我重试过的代码片段。 当任何正在调用的服务关闭并且程序不重试或进入恢复块时,我立即收到IO异常。 是因为没有为新线程创建代理。

@SpringBootApplication
@EnableRetry
public class SpringBootWebApplication implements CommandLineRunner{

    @Autowired
    RestClient client;

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

      @Override
    public void run(String... args) throws Exception {

       String a[] = new String[] {args[0],args[1],args[2] }; 

            // getting the list view of Array 
            List<String> list = Arrays.asList(a); 

        client.executeRest(list)
    }

}

######

I have another class where future tasks will be created.

public class RestClient(){
     public void executeRest(List<String> uris)){

       ExecutorService executor = Executors.newFixedThreadPool(2);
       for(String uri : uris){
           Future<String> t = executor.execute(new MyCallable(uri));
        }
     }
}


public class MyCallable implements Callable<String> {

    private String endPoint;

    public MyCallable(String endPoint){
        this.endPoint=endPoint;
    }

    @Override
    public void call() throws Exception {     
         system.out.println(makeRestGetCall(String uri));
    }

     @Retryable(
      value = { Excelption.class }, 
      maxAttempts = 2,
      backoff = @Backoff(delay = 5000))
        public String makeRestGetCall(String uri){
           return restTemplate.exchange(uri, HttpMethod.GET,String.class);
        }

      @Recover
    void recover(Exception e){
      system.out.println("Max retries done")
     }

}

1 个答案:

答案 0 :(得分:0)

仅当该方法抛出在值中配置的异常(在您的情况下为Exception)时尝试重试, restTemplate.exchange 方法抛出多个Exceptions,因此尝试使用自定义Exception

public class CustomException extends RuntimeException {

    }

重试方法

 @Retryable(
  value = { CustomException.class }, 
  maxAttempts = 2,
  backoff = @Backoff(delay = 5000))
    public String makeRestGetCall(String uri){
         try {
       return restTemplate.exchange(uri, HttpMethod.GET,String.class);
          }catch(Exception ex) {

           // do something or log something 
             throw new CustomException();
           }
    }