| = MicroProfile Fault Tolerance - Fallback |
| :index-group: MicroProfile |
| :jbake-type: page |
| :jbake-status: published |
| |
| 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 http://download.eclipse.org/microprofile/microprofile-fault-tolerance-1.1/microprofile-fault-tolerance-spec.html[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. |
| |
| ```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!"; |
| } |
| } |
| ``` |
| |
| 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. |
| |
| ```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!"; |
| } |
| } |
| ``` |
| |
| 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 link:src/test/java/org/superbiz/rest/WeatherServiceTest.java[WeatherServiceTest.java] disponivel neste projeto. |
| |
| mvn clean test |
| |
| ``` |
| [INFO] Results: |
| [INFO] |
| [INFO] Tests run: 2, Failures: 0, Errors: 0, Skipped: 0 |
| ``` |
| |