mvn clean install tomee:run
MicroProfile Fault Tolerance - Fallback
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
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