= MicroProfile Fault Tolerance - Timeout
:index-group: MicroProfile
:jbake-type: page
:jbake-status: published

This is an example of how to use Microprofile @Timeout in TomEE.

[discrete]
== Timeout Feature

Fault Tolerance Timeout allow to specify how long a task can take to complete its execution and aborting it
in case of timeout. Timeout feature can be used along with other annotations to guide the execution and result of a task. +
Check the
https://download.eclipse.org/microprofile/microprofile-fault-tolerance-1.1/microprofile-fault-tolerance-spec.html#_timeout_usage[specification]
for more details.

Timeout annotation allows to configure :

* *value:* the timeout value
* *unit:* the timeout unit

[discrete]
== Example

[discrete]
=== Run the application

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

[discrete]
=== How does it work?

The method `statusOfDayByAccuWeather` fails when the threshold of `@Timeout` annotation is reached due to a long execution of
`longProcessingTask` method. To respond to the request nicely, a fallback method will take place to complete the request
successfully. The fallback method is determined by @Fallback annotation.

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

Day status call

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

Server log

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

Response

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

[discrete]
=== Running the test

You can also try it out using the
link:src/test/java/org/superbiz/rest/WeatherServiceTest.java[WeatherServiceTest.java]
available in the project.

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

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