Preloader image

Este é um exemplo de como usar o Microprofile @Timeout no TomEE.

Funcionalidade de tiempo de espera (Timeout)

Fault Tolerance Timeout permite especificar quanto tempo pode tomar uma tarefa em completar sua execução e abortá-lo caso demore mais que o tempo especificado. A funcionalidade de Timeout pode ser usada em conjunto com outras anotações para guiar a execução e resultado de uma tarefa. Olhe para o especificación para mais detalles.

A anotação @Timeout permite configurar:

  • value: o valor do tempo de espera

  • unit: a unidade do tempo de espera

Exemplo

Execute o aplicativo

mvn clean install tomee:run

Como funciona isto?

O método statusOfDayByAccuWeather falha quando se atinge o limiar da anotação @Timeout devido a uma larga execução do método longProcessingTask. Para responder bem a solicitação, se executará um método alternativo para completar a solicitação exitosamente. O método alternativo está determinado pela anotação @Fallback.

@RequestScoped
public class WeatherGateway {

    private static final Logger LOGGER = Logger.getLogger(WeatherGateway.class.getName());

    @Timeout(50)
    @Fallback(fallbackMethod = "statusOfWeekByMetEireann")
    public String statusOfDayByAccuWeather(){
        return longProcessingTask();
    }

    public String statusOfWeekByMetEireann(){
        LOGGER.log(Level.WARNING, "MetEireann backup service has been requested due to AccuWeather timeout");
        return "Beautiful day";
    }

    private String longProcessingTask(){
        try {
            Thread.sleep(80);
        } catch (InterruptedException e) {
            LOGGER.log(Level.WARNING,"AccuWeather task has been interrupted.");
        }
        return null;
    }
    ...
}

Chamada para o estado do dia

GET http://localhost:8080/mp-faulttolerance-timeout/weather/day/status

Logs do Servidor

WARNING AccuWeather task has been interrupted.
WARNING MetEireann fallback service has been requested due to AccuWeather timeout.

Resposta HTTP

Beautiful day!

Executando os testes

Você também pode experimentá-lo usando o WeatherServiceTest.java disponível no projeto.

mvn clean test
[INFO] Results:
[INFO]
[INFO] Tests run: 1, Failures: 0, Errors: 0, Skipped: 0