2015-09-02 11 views
5

Ciao Sto usando la molla RestTemplate per chiamare un'API REST. L'API può essere molto lenta o anche offline. La mia applicazione sta costruendo la cache inviando migliaia di richieste una dopo l'altra. Anche le risposte possono essere molto lente, perché contengono molti dati.Riprova java RestTemplate Richiesta HTTP se host offline

Ho già aumentato il timeout a 120 secondi. Il mio problema ora che l'API può essere offline e ottengo un'eccezione org.apache.http.conn.ConnectionPoolTimeoutException: Timeout waiting for connection from pool.

Nel caso in cui l'API sia offline, l'applicazione deve attendere e riprovare finché l'API non è di nuovo in linea.

Posso ottenere questo in RestTemplate fuori dalla scatola senza creare loop di eccezioni da solo?

Grazie!

+0

No, non è possibile, è necessario farlo manualmente. Inoltre, se il tempo di 120 secondi non è sufficiente per ottenere i dati, è necessario contattare lo sviluppatore dell'API. –

risposta

1

Ho avuto la stessa situazione e ho fatto un po 'di ricerca su google trovato la soluzione. Dando risposta nella speranza aiuta qualcun altro. È possibile impostare il numero massimo di tentativi e l'intervallo di tempo per ogni tentativo.

@Bean 
    public RetryTemplate retryTemplate() { 

    int maxAttempt = Integer.parseInt(env.getProperty("maxAttempt")); 
    int retryTimeInterval = Integer.parseInt(env.getProperty("retryTimeInterval")); 

    SimpleRetryPolicy retryPolicy = new SimpleRetryPolicy(); 
    retryPolicy.setMaxAttempts(maxAttempt); 

    FixedBackOffPolicy backOffPolicy = new FixedBackOffPolicy(); 
    backOffPolicy.setBackOffPeriod(retryTimeInterval); // 1.5 seconds 

    RetryTemplate template = new RetryTemplate(); 
    template.setRetryPolicy(retryPolicy); 
    template.setBackOffPolicy(backOffPolicy); 

    return template; 
    } 

E il mio servizio di riposo che voglio eseguire è di seguito.

retryTemplate.execute(context -> { 
     System.out.println("inside retry method"); 
     ResponseEntity<?> requestData = RestTemplateProvider.getInstance().postAsNewRequest(bundle, ServiceResponse.class, serivceURL, 
       CommonUtils.getHeader("APP_Name")); 

     _LOGGER.info("Response ..."+ requestData); 
      throw new IllegalStateException("Something went wrong"); 
     });