Preloader image

Este es un ejemplo de como usar Microprofile @Timeout en TomEE.

Funcionalidad de tiempo de espera (Timeout)

Fault Tolerance Timeout permite especificar cuánto tiempo puede tomar una tarea en completar su ejecución y abortarla en caso que tarde más del tiempo especificado. La funcionalidad de Timeout puede ser usada en conjunto con otras anotaciones para guiar la ejecución y resultado de una tarea. Mira la especificación para mas detalles.

La anotación @Timeout permite configurar:

  • value: el valor del tiempo de espera

  • unit: la unidad del tiempo de espera

Ejemplo

Ejecuta la aplicación

mvn clean install tomee:run

Como funciona esto?

El método statusOfDayByAccuWeather falla cuando se alcanza el umbral de la anotación @Timeout debido a una larga ejecución del método longProcessingTask. Para responder bien a la solicitud, se ejecutará un método alternativo para completar la solicitud exitosamente. El método alternativo está determinado por la anotación @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;
    }
    ...
}

Llamada al estado del día

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

Logs en el Servidor

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

Respuesta HTTP

Beautiful day!

Ejecutando las pruebas

También puedes probarlo usando el WeatherServiceTest.java disponible en el proyecto.

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