This is an automated email from the ASF dual-hosted git repository.
dblevins pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/tomee.git
The following commit(s) were added to refs/heads/master by this push:
new e988a16 add translate in PT to mp-faulttolerance-retry
new 138ae80 Merge pull request #565 from
robinsonvs/mp-faulttolerance-retry-portuguese
e988a16 is described below
commit e988a168cad5723add78aea105c66c13d4f9b683
Author: Robinson Severo <[email protected]>
AuthorDate: Mon Sep 9 12:44:39 2019 -0300
add translate in PT to mp-faulttolerance-retry
---
examples/mp-faulttolerance-retry/README_pt.adoc | 252 ++++++++++++++++++++++++
1 file changed, 252 insertions(+)
diff --git a/examples/mp-faulttolerance-retry/README_pt.adoc
b/examples/mp-faulttolerance-retry/README_pt.adoc
new file mode 100644
index 0000000..5cd00ca
--- /dev/null
+++ b/examples/mp-faulttolerance-retry/README_pt.adoc
@@ -0,0 +1,252 @@
+= MicroProfile Fault Tolerance - Retry Policy
+:index-group: MicroProfile
+:jbake-type: page
+:jbake-status: published
+
+Este é um exemplo de como usar
+Microprofile @Retry em TomEE.
+
+== Retry Feature
+
+Microprofile Fault Tolerance tem um recurso chamado Retry que pode ser usado
+para recuperar uma operação de falha, chamando a mesma operação novamente
+até atingir seus critérios de parada.
+
+A Retry policy permite configurar :
+
+* *maxRetries*: o máximo de tentativas
+* *delay*: atrasos entre cada tentativa
+* *delayUnit*: a unidade de atraso
+* *maxDuration*: duração máxima para executar a nova tentativa
+* *durationUnit*: unidade de duração
+* *jitter:* a variação aleatória dos atrasos de uma nova tentativa
+* *jitterDelayUnit:* a unidade de instabilidade
+* *retryOn:* especifique as falhas para tentar novamente
+* *abortOn:* especifique as falhas para abortar
+
+Para usar esse recurso, você pode anotar uma classe e/ou um método com a
anotação @Retry. Verifique em
+http://download.eclipse.org/microprofile/microprofile-fault-tolerance-1.1/microprofile-fault-tolerance-spec.html[specification]
+para mais detalhes.
+
+== Exemplos
+
+=== Execute o aplicativo
+
+....
+mvn clean install tomee:run
+....
+
+=== Exemplo 1
+
+O método statusOfDay falhará 3 (três) vezes, a cada vez, lançando uma
+`WeatherGatewayTimeoutException` e como a anotação @Retry está
+configurada para `retryOn` em caso de falha, a biblioteca FailSafe pegará
+o valor `maxRetry` e tentará a mesma operação até atingir o número máximo de
tentativas, que é 3 (valor padrão).
+
+[source,java]
+----
+@RequestScoped
+public class WeatherGateway{
+ ...
+ @Retry(maxRetry=3, retryOn = WeatherGatewayTimeoutException.class)
+ public String statusOfDay(){
+ if(counterStatusOfDay.addAndGet(1) <= DEFAULT_MAX_RETRY){
+ LOGGER.warning(String.format(FORECAST_TIMEOUT_MESSAGE,
DEFAULT_MAX_RETRY, counterStatusOfDay.get()));
+ throw new WeatherGatewayTimeoutException();
+ }
+ return "Today is a sunny day!";
+ }
+ ...
+ }
+----
+
+Chamada de status do dia
+
+....
+GET http://localhost:8080/mp-faulttolerance-retry/weather/day/status
+....
+
+Server log
+
+....
+WARNING - Timeout when accessing AccuWeather Forecast Service. Max of
Attempts: (3), Attempts: (1)
+WARNING - Timeout when accessing AccuWeather Forecast Service. Max of
Attempts: (3), Attempts: (2)
+WARNING - Timeout when accessing AccuWeather Forecast Service. Max of
Attempts: (3), Attempts: (3)
+....
+
+Response
+
+....
+Today is a sunny day!
+....
+
+=== Exemplo 2
+
+O método weekStatus falhará duas vezes, a cada vez, lançando uma
+`WeatherGatewayTimeoutException` porque `retryOn` está configurado e
+em vez de retornar uma resposta ao chamador, a lógica afirma que na terceira
tentativa uma
+`WeatherGatewayBusyServiceException` será lançada. Como a anotação `@Retry`
está configurada para
+ `abortOn` no caso de `WeatherGatewayTimeoutException` ocorrer, a tentativa
restante não será
+executada e o chamador deve lidar com a exceção.
+
+[source,java]
+----
+@Retry(maxRetries = 3, retryOn = WeatherGatewayTimeoutException.class, abortOn
= WeatherGatewayBusyServiceException.class)
+public String statusOfWeek(){
+ if(counterStatusOfWeek.addAndGet(1) <= DEFAULT_MAX_RETRY){
+ LOGGER.warning(String.format(FORECAST_TIMEOUT_MESSAGE_ATTEMPTS,
DEFAULT_MAX_RETRY, counterStatusOfWeek.get()));
+ throw new WeatherGatewayTimeoutException();
+ }
+ LOGGER.log(Level.SEVERE, String.format(FORECAST_BUSY_MESSAGE,
counterStatusOfWeek.get()));
+ throw new WeatherGatewayBusyServiceException();
+}
+----
+
+Chamada de status da semana
+
+....
+GET http://localhost:8080/mp-faulttolerance-retry/weather/week/status
+....
+
+Server log
+
+....
+WARNING - Timeout when accessing AccuWeather Forecast Service. Max of
Attempts: (3), Attempts: (1)
+WARNING - Timeout when accessing AccuWeather Forecast Service. Max of
Attempts: (3), Attempts: (2)
+WARNING - Timeout when accessing AccuWeather Forecast Service. Max of
Attempts: (3), Attempts: (3)
+SEVERE - Error AccuWeather Forecast Service is busy. Number of Attempts: (4)
+....
+
+Response
+
+....
+WeatherGateway Service is Busy. Retry later
+....
+
+=== Exemplo 3
+
+A anotação `@Retry` permite configurar um atraso para cada nova tentativa
+ser executada, dando a chance ao serviço solicitado para se recuperar e
+responder a solicitação corretamente. Para cada nova tentativa, seguindo o
atraso
+configurado, é necessário definir `jitter` como zero (0). Caso contrário, o
atraso de
+cada nova tentativa será aleatório.
+
+Analisando o log de mensagens, é possível ver que todas as tentativas levaram
+praticamente o mesmo tempo para executar.
+
+[source,java]
+----
+@Retry(retryOn = WeatherGatewayTimeoutException.class, maxRetries = 5, delay =
500, jitter = 0)
+public String statusOfWeekend() {
+ if (counterStatusOfWeekend.addAndGet(1) <= 5) {
+ logTimeoutMessage(statusOfWeekendInstant);
+ statusOfWeekendInstant = Instant.now();
+ throw new WeatherGatewayTimeoutException();
+ }
+ return "The Forecast for the Weekend is Scattered Showers.";
+}
+----
+
+Chamada de status de fim de semana
+
+....
+GET http://localhost:8080/mp-faulttolerance-retry/weather/weekend/status
+....
+
+Server log
+
+....
+WARNING - Timeout when accessing AccuWeather Forecast Service.
+WARNING - Timeout when accessing AccuWeather Forecast Service. Delay before
this attempt: (501) millis
+WARNING - Timeout when accessing AccuWeather Forecast Service. Delay before
this attempt: (501) millis
+WARNING - Timeout when accessing AccuWeather Forecast Service. Delay before
this attempt: (501) millis
+WARNING - Timeout when accessing AccuWeather Forecast Service. Delay before
this attempt: (500) millis
+....
+
+=== Exemplo 4
+
+Basicamente com o mesmo comportamento do `Exemplo 3`, este exemplo defini
+o `delay` e o `jitter` com 500 milissegundos para aleatoriamente um novo
atraso a cada nova tentativa
+após a primeira falha.
+https://github.com/jhalterman/failsafe/blob/master/src/main/java/net/jodah/failsafe/AbstractExecution.java[AbstractExecution#randomDelay(delay,jitter,random)]
+pode dar uma ideia de como o novo atraso é calculado.
+
+Analisando o log de mensagens, é possível ver quanto tempo cada tentativa teve
+que esperar até a sua execução.
+
+[source,java]
+----
+@Retry(retryOn = WeatherGatewayTimeoutException.class, delay = 500, jitter =
500)
+public String statusOfMonth() {
+ if (counterStatusOfWeekend.addAndGet(1) <= DEFAULT_MAX_RETRY) {
+ logTimeoutMessage(statusOfMonthInstant);
+ statusOfMonthInstant = Instant.now();
+ throw new WeatherGatewayTimeoutException();
+ }
+ return "The Forecast for the Weekend is Scattered Showers.";
+}
+----
+
+Chamada de status do mês
+
+....
+GET http://localhost:8080/mp-faulttolerance-retry/weather/month/status
+....
+
+Server log
+
+....
+WARNING - Timeout when accessing AccuWeather Forecast Service.
+WARNING - Timeout when accessing AccuWeather Forecast Service. Delay before
this attempt: (417) millis
+WARNING - Timeout when accessing AccuWeather Forecast Service. Delay before
this attempt: (90) millis
+....
+
+=== Example 5
+
+Se uma condição para uma operação re-executada não estiver definida como nos
+exemplos anteriores usando o parâmetro `retryOn`, a operação é
+executada novamente para qualquer exceção lançada.
+
+[source,java]
+----
+@Retry(maxDuration = 1000)
+public String statusOfYear(){
+ if (counterStatusOfWeekend.addAndGet(1) <= 5) {
+ logTimeoutMessage(statusOfYearInstant);
+ statusOfYearInstant = Instant.now();
+ throw new RuntimeException();
+ }
+ return "WeatherGateway Service Error";
+}
+----
+
+Chamada de status do ano
+
+....
+GET http://localhost:8080/mp-faulttolerance-retry/weather/year/statusk
+....
+
+Server log
+
+....
+WARNING - Timeout when accessing AccuWeather Forecast Service.
+WARNING - Timeout when accessing AccuWeather Forecast Service. Delay before
this attempt: (666) millis
+WARNING - Timeout when accessing AccuWeather Forecast Service. Delay before
this attempt: (266) millis
+WARNING - Timeout when accessing AccuWeather Forecast Service. Delay before
this attempt: (66) millis
+....
+
+=== Execute os testes
+
+Você também pode experimentar usando
+link:src/test/java/org/superbiz/rest/WeatherServiceTest.java[WeatherServiceTest.java]
+disponível no projeto.
+
+....
+mvn clean test
+....
+
+....
+[INFO] Results:
+[INFO]
+[INFO] Tests run: 5, Failures: 0, Errors: 0, Skipped: 0
+....