Весна, повторная попытка с будущими задачами не работает - PullRequest
0 голосов
/ 07 апреля 2019

У меня есть приложение с начальной загрузкой, которое должно вызывать внешние API. Если есть «n» внешних вызовов, будут созданы «n» будущие задачи и будут сделаны остальные вызовы. Проблема здесь заключается в том, что если какой-либо из остальных вызовов завершится неудачно, я должен повторить вызов 3 раза. Я пытался использовать Spring-retry, но он не повторяется при ошибке.

Ниже приведен фрагмент кода, который я до сих пор пытался повторить. Я сразу же получаю исключение ввода-вывода, когда какая-либо вызываемая служба не работает, и программа не повторяет попытки или не входит в блок восстановления. Это потому что прокси не создаются для новых тем.

@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 голосов
/ 07 апреля 2019

Повторная попытка будет предпринята только в том случае, если метод генерирует исключение, настроенное в значении (в вашем случае это 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();
           }
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...