2016-03-07 2 views
2

Как вы можете интегрировать Spring Retry с внешними вызовами с AsyncRestTemplate? Если это невозможно, есть ли другая инфраструктура, которая его поддерживает?Как интегрировать Spring Retry с AsyncRestTemplate

Мой случай использования:

public void doSomething() throws ExecutionException, InterruptedException { 

    ListenableFuture<ResponseEntity<String>> future = asyncRestTemplate.getForEntity("http://localhost/foo", String.class); 

    // do some tasks here 

    ResponseEntity<String> stringResponseEntity = future.get(); // <-- How do you retry just this call? 

} 

Как вы повторить этот future.get() вызов? Если внешняя служба возвращает 404, я хочу избежать повторного вызова этих задач и просто повторить внешний вызов? Я не могу просто обернуть future.get() с помощью retryTemplate.execute(), потому что он фактически не будет выполнять другой вызов внешней службы.

ответ

0

Вы должны обернуть весь doSomething (или, по крайней мере, операцию шаблона и получить) в шаблоне повтора.

EDIT

Вместо вызова get() можно добавить ListenableFutureCallback в будущее; что-то вроде этого ...

final AtomicReference<ListenableFuture<ResponseEntity<String>>> future = 
    new AtomicReference<>(asyncRestTemplate.getForEntity("http://localhost/foo", String.class)); 

final CountDownLatch latch = new CountDownLatch(1); 
future.addCallback(new ListenableFutureCallback<String>() { 

    int retries; 

    @Override 
    public void onSuccess(String result) { 

     if (notTheResultIWant) { 
      future.set(asyncTemplate.getFor (...)); 
      future.get().addCallback(this);  
      retries++;   
     } 
     else { 
       latch.countDown(); 
     } 
    } 

    @Override 
    public void onFailure(Throwable ex) { 
     latch.countDown(); 
    } 

}); 


if (latch.await(10, Timeunit.SECONDS) { 
    ... 
    future.get().get(); 
} 
+0

Выполняя это, я выполнял вызовы между операцией шаблона и получал также, верно? Есть ли способ повторить только внешний вызов и использовать методы между асинхронным запуском? (т. е. операция шаблона и get * could * могут быть перенесены в начало метода, но, выполняя 'future.get()', текущий поток будет заблокирован, который побеждает цель использования 'AsyncRestTemplate' для внешнего вызова. – Glide

+0

См. Мое редактирование одним способом, чтобы получить новое «Будущее». –

Смежные вопросы