Preloader image

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

Recurso de Fallback

Fault Tolerance Fallback fornece uma alternativa no caso de falha de uma execução. Esta alternativa será chamada quando um Retry ou CircuitBreaker falhar.

Para usar esta funcionalidade é necessario anotar o método com @Fallback.

As politicas do Fallback permitem configurar :

  • value: Uma classe que implementa o FallbackHandler

  • fallbackMethod: O método que será executado.

Os Parâmetros value e `fallbackMethod`eles não podem ser especificados ao mesmo tempo.

Para mais detalhes, verifique a Especificação .

Exemplos

Executando o aplicativo

mvn clean install tomee:run

Exemplo 1

O método statusOfDay sempre falhará lançando WeatherException e como a anotação @CircuitBreaker esta configurada com failOn no caso de uma exceção, o 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!";
   }
}

Chamada de status do dia

GET http://localhost:8080/mp-faulttolerance-fallback/weather/day/status

Log do servidor

SEVERE [http-nio-8080-exec-2] org.superbiz.rest.WeatherDayStatusFallbackHandler.handle WeatherDayStatusFallbackHandler was triggered due a fail

Resposta

Hi, today is a sunny day!

Exemplo 2

O método statusOfDay sempre falhará lançando WeatherException e como a anotação @Retry está configurada com maxRetries = 1 no caso de falha, o método fallback, fallbackForWeekStatus será invocado após tentar novamente uma 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!";
  }
}

Chamada de status do dia

GET http://localhost:8080/mp-faulttolerance-fallback/weather/week/status

Log do servidor

SEVERE [http-nio-8080-exec-2] org.superbiz.rest.WeatherService.fallbackForWeekStatus Fallback was triggered due a fail

Resposta

Hi, week will be mostly sunny!

Execução dos testes

Você também pode usar o teste WeatherServiceTest.java disponivel neste projeto.

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