blob: aec76e65efb444dd42397241b19af828a1e21025 [file] [log] [blame]
= MicroProfile Fault Tolerance - Fallback
:index-group: MicroProfile
:jbake-type: page
:jbake-status: published
Este es un ejemplo de como usar Microprofile @Fallback en TomEE.
== Fallback Feature
Fault Tolerance Fallback provee una alternativa en caso de fallo de una ejecución. Esta alternativa será llamada cuando
un `Retry` o `CircuitBreaker` ha fallado.
Para usar esta funcionalidad es necesario anotar el método con `@Fallback`.
Las politicas del Fallback permiten configurar :
* **value**: Una clase que implementa `FallbackHandler`
* **fallbackMethod**: El método que será ejecutado.
Los parámetros `value` and `fallbackMethod` no pueden ser especificados a la vez.
Para más detalles revisar http://download.eclipse.org/microprofile/microprofile-fault-tolerance-1.1/microprofile-fault-tolerance-spec.html[Especificación]
== Ejemplos
=== Ejecutar la aplicación
mvn clean install tomee:run
=== Ejemplo 1
El método `statusOfDay` siempre fallará lanzando `WeatherException` y como la anotación
`@CircuitBreaker` esta configurada con `failOn` en caso de una excepción, el fallback,
`WeatherDayStatusFallbackHandler#handle` será invocado.
```java
@RequestScoped
public class WeatherService {
...
@GET
@Path("/day/status")
@CircuitBreaker(failOn = WeatherException.class)
@Fallback(WeatherDayStatusFallbackHandler.class)
public String dayStatus() {
throw new WeatherException();
}
...
}
public class WeatherDayStatusFallbackHandler implements FallbackHandler<String> {
@Override
public String handle(ExecutionContext executionContext) {
return "Hi, today is a sunny day!";
}
}
```
Llama el estado del tiempo del dia
GET http://localhost:8080/mp-faulttolerance-fallback/weather/day/status
Bitácora del servidor
```
SEVERE [http-nio-8080-exec-2] org.superbiz.rest.WeatherDayStatusFallbackHandler.handle WeatherDayStatusFallbackHandler was triggered due a fail
```
Respuesta
```
Hi, today is a sunny day!
```
=== Ejemplo 2
El método `statusOfDay` siempre fallará lanzando `WeatherException` y como la anotación
`@Retry` está configurada con `maxRetries = 1` en caso de fallo, el método fallback,
`fallbackForWeekStatus` se invocará después de reintentar una vez.
```java
@RequestScoped
public class WeatherService {
...
@GET
@Path("/week/status")
@Retry(maxRetries = 1)
@Fallback(fallbackMethod = "fallbackForWeekStatus")
public String weekStatus() {
throw new WeatherException();
}
public String fallbackForWeekStatus() {
return "Hi, week will be mostly sunny!";
}
...
}
```
Llamada del estado del tiempo de la semana
GET http://localhost:8080/mp-faulttolerance-fallback/weather/week/status
Bitácora del servidor
```
SEVERE [http-nio-8080-exec-2] org.superbiz.rest.WeatherService.fallbackForWeekStatus Fallback was triggered due a fail
```
Respuesta
```
Hi, week will be mostly sunny!
```
=== Ejecución de las pruebas
Puede además usar la prueba link:src/test/java/org/superbiz/rest/WeatherServiceTest.java[WeatherServiceTest.java] disponible en este proyecto.
mvn clean test
```
[INFO] Results:
[INFO]
[INFO] Tests run: 2, Failures: 0, Errors: 0, Skipped: 0
```