Preloader image

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 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.

@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.

@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 WeatherServiceTest.java disponible en este proyecto.

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