blob: 4ce4e04c93054270c2a236eb52fb66ce1ce72943 [file] [log] [blame]
= Tolerancia a fallos (Fault Tolerance) en MicroProfile - Timeout (Tiempo de espera)
:index-group: MicroProfile
:jbake-type: page
:jbake-status: published
Este es un ejemplo de como usar Microprofile `@Timeout` en TomEE.
[discrete]
== 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
https://download.eclipse.org/microprofile/microprofile-fault-tolerance-1.1/microprofile-fault-tolerance-spec.html#_timeout_usage[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
[discrete]
== Ejemplo
[discrete]
=== Ejecuta la aplicación
[source,bash]
----
mvn clean install tomee:run
----
[discrete]
=== 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`.
[source,java]
----
@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
[source,text]
----
GET http://localhost:8080/mp-faulttolerance-timeout/weather/day/status
----
Logs en el Servidor
[source,text]
----
WARNING AccuWeather task has been interrupted.
WARNING MetEireann fallback service has been requested due to AccuWeather timeout.
----
Respuesta HTTP
[source,text]
----
Beautiful day!
----
[discrete]
=== Ejecutando las pruebas
También puedes probarlo usando el
link:src/test/java/org/superbiz/rest/WeatherServiceTest.java[WeatherServiceTest.java] disponible en el proyecto.
[source,text]
----
mvn clean test
----
----
[INFO] Results:
[INFO]
[INFO] Tests run: 1, Failures: 0, Errors: 0, Skipped: 0
----