= Tolerância a falhas (Fault Tolerance) no MicroProfile - Timeout (Tempo de espera)
:index-group: MicroProfile
:jbake-type: page
:jbake-status: published

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

[discrete]
== 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
https://download.eclipse.org/microprofile/microprofile-fault-tolerance-1.1/microprofile-fault-tolerance-spec.html#_timeout_usage[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

[discrete]
== Exemplo

[discrete]
=== Execute o aplicativo

[source,bash]
----
mvn clean install tomee:run
----

[discrete]
=== 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`.

[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;
    }
    ...
}
----

Chamada para o estado do dia

[source,text]
----
GET http://localhost:8080/mp-faulttolerance-timeout/weather/day/status
----

Logs do Servidor

[source,text]
----
WARNING AccuWeather task has been interrupted.
WARNING MetEireann fallback service has been requested due to AccuWeather timeout.
----

Resposta HTTP

[source,text]
----
Beautiful day!
----

[discrete]
=== Executando os testes

Você também pode experimentá-lo usando o
link:src/test/java/org/superbiz/rest/WeatherServiceTest.java[WeatherServiceTest.java] disponível no projeto.

[source,text]
----
mvn clean test
----

----
[INFO] Results:
[INFO]
[INFO] Tests run: 1, Failures: 0, Errors: 0, Skipped: 0
----
