You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@tomee.apache.org by jl...@apache.org on 2018/12/07 12:42:27 UTC
[05/18] tomee git commit: [TOMEE-2291] - Fault Tolerance Microprofile
example for @Retry
[TOMEE-2291] - Fault Tolerance Microprofile example for @Retry
Minimal change for statusOfYear method which had retryOn, maxRetry and delay parameter removed to retry the same operation for a RuntimeException.
and slight change in README.md file.
Project: http://git-wip-us.apache.org/repos/asf/tomee/repo
Commit: http://git-wip-us.apache.org/repos/asf/tomee/commit/1396ab44
Tree: http://git-wip-us.apache.org/repos/asf/tomee/tree/1396ab44
Diff: http://git-wip-us.apache.org/repos/asf/tomee/diff/1396ab44
Branch: refs/heads/master
Commit: 1396ab4409f82f4fdfcf0846bac792434c8f10fb
Parents: 728c612
Author: josehenriqueventura <J2705hvq*>
Authored: Wed Dec 5 15:33:30 2018 +0000
Committer: josehenriqueventura <J2705hvq*>
Committed: Wed Dec 5 15:33:30 2018 +0000
----------------------------------------------------------------------
examples/mp-faulttolerance-retry/README.md | 108 ++++++++++---------
.../java/org/superbiz/rest/WeatherGateway.java | 12 +--
.../java/org/superbiz/rest/WeatherService.java | 2 +-
.../org/superbiz/rest/WeatherServiceTest.java | 2 +-
4 files changed, 66 insertions(+), 58 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/tomee/blob/1396ab44/examples/mp-faulttolerance-retry/README.md
----------------------------------------------------------------------
diff --git a/examples/mp-faulttolerance-retry/README.md b/examples/mp-faulttolerance-retry/README.md
index aa719bb..fced047 100644
--- a/examples/mp-faulttolerance-retry/README.md
+++ b/examples/mp-faulttolerance-retry/README.md
@@ -2,7 +2,8 @@
This is an example of how to use Microprofile @Retry in TomEE.
#### Retry Feature
-Microprofile Fault Tolerance has a feature called Retry that can be used to recover an operation from failure, invoking the same operation again.
+Microprofile Fault Tolerance has a feature called Retry that can be used to recover an operation from failure, invoking the same operation again
+until it reaches its stopping criteria.
The Retry policy allows to configure :
@@ -31,7 +32,7 @@ The method statusOfDay will fail three times, each time, throwing a `WeatherGate
@Retry annotation is configured to `retryOn` in case of failure, the FailSafe library will take the `maxRetry` value and
retry the same operation until it reaches the number maximum of attempts, which is 3 (default value).
-```
+```java
@RequestScoped
public class WeatherGateway{
...
@@ -70,17 +71,16 @@ returning a response to the caller, the logic states that at the third attempt,
As the `@Retry` annotation is configured to `abortOn` in case of `WeatherGatewayTimeoutException` happens, the remaining attempt won't be
executed and the caller must handle the exception.
-```
- @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();
+```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();
+}
```
Week status call
@@ -109,16 +109,15 @@ is needed to set `jitter` to zero (0). Otherwise the delay of each new attempt w
Analysing the logged messages, is possible to see that all attempts took the pretty much the same time to execute.
-```
- @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.";
+```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.";
}
```
@@ -130,29 +129,30 @@ Server log
```
WARNING - Timeout when accessing AccuWeather Forecast Service.
-WARNING - Timeout when accessing AccuWeather Forecast Service. Delay of each attempt: (501) millis
-WARNING - Timeout when accessing AccuWeather Forecast Service. Delay of each attempt: (501) millis
-WARNING - Timeout when accessing AccuWeather Forecast Service. Delay of each attempt: (501) millis
-WARNING - Timeout when accessing AccuWeather Forecast Service. Delay of each attempt: (500) 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: (501) millis
+WARNING - Timeout when accessing AccuWeather Forecast Service. Delay before this attempt: (500) millis
```
##### Example 4
Basically with the same behaviour of the `Example 3`, this example sets the `delay` and `jitter` with 500 millis to randomly
-create a new delay for each new attempt after the first failure.
+create a new delay for each new attempt after the first failure. [AbstractExecution#randomDelay(delay,jitter,random)](https://github.com/jhalterman/failsafe/blob/master/src/main/java/net/jodah/failsafe/AbstractExecution.java)
+can give a hit of how the new delay is calculated.
Analysing the logged messages, is possible to see how long each attempt had to wait until its execution.
-```
- @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.";
+```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.";
+}
```
Month status call
@@ -163,33 +163,41 @@ Server log
```
WARNING - Timeout when accessing AccuWeather Forecast Service.
-WARNING - Timeout when accessing AccuWeather Forecast Service. Delay of each attempt: (417) millis
-WARNING - Timeout when accessing AccuWeather Forecast Service. Delay of each attempt: (90) millis
+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
-```
- @Retry(retryOn = WeatherGatewayTimeoutException.class, maxRetries = 5, delay = 500, jitter = 500, maxDuration = 1000)
- public String statusOfYear() {
- if (counterStatusOfWeekend.addAndGet(1) <= 5) {
- logTimeoutMessage(statusOfYearInstant);
- statusOfYearInstant = Instant.now();
- throw new WeatherGatewayTimeoutException();
- }
- return "Status of the Year is unavailable.";
+If a condition for an operation be re-executed is not set as in the previous examples using the parameter `retryOn`,
+the operation is executed again for _any_ exception that is thrown.
+
+```java
+@Retry(maxDuration = 1000)
+public String statusOfYear(){
+ if (counterStatusOfWeekend.addAndGet(1) <= 5) {
+ logTimeoutMessage(statusOfYearInstant);
+ statusOfYearInstant = Instant.now();
+ throw new RuntimeException();
}
+ return "WeatherGateway Service Error";
+}
```
Year status call
- GET http://localhost:8080/mp-faulttolerance-retry/weather/weekend/status
+ 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 of each attempt: (666) millis
-WARNING - Timeout when accessing AccuWeather Forecast Service. Delay of each attempt: (266) millis
-WARNING - Timeout when accessing AccuWeather Forecast Service. Delay of each attempt: (66) millis
+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
```
+
+##### Run the tests
+
+You can also try it out using the [WeatherServiceTest.java](../../../../../WeatherServiceTest.java) available in the project.
+
http://git-wip-us.apache.org/repos/asf/tomee/blob/1396ab44/examples/mp-faulttolerance-retry/src/main/java/org/superbiz/rest/WeatherGateway.java
----------------------------------------------------------------------
diff --git a/examples/mp-faulttolerance-retry/src/main/java/org/superbiz/rest/WeatherGateway.java b/examples/mp-faulttolerance-retry/src/main/java/org/superbiz/rest/WeatherGateway.java
index e2cf413..1b50071 100644
--- a/examples/mp-faulttolerance-retry/src/main/java/org/superbiz/rest/WeatherGateway.java
+++ b/examples/mp-faulttolerance-retry/src/main/java/org/superbiz/rest/WeatherGateway.java
@@ -37,7 +37,7 @@ public class WeatherGateway {
"Timeout when accessing AccuWeather Forecast Service.";
private static final String FORECAST_TIMEOUT_MESSAGE_DELAY =
- "Timeout when accessing AccuWeather Forecast Service. Delay of each attempt: (%d)";
+ "Timeout when accessing AccuWeather Forecast Service. Delay before this attempt: (%d)";
private static final String FORECAST_BUSY_MESSAGE =
"Error AccuWeather Forecast Service is busy. Number of Attempts: (%d) \n";
@@ -91,17 +91,17 @@ public class WeatherGateway {
statusOfMonthInstant = Instant.now();
throw new WeatherGatewayTimeoutException();
}
- return "The Forecast for the Month is sunny most of the days";
+ return "The Forecast for the Month is Sunny for most of the days";
}
- @Retry(retryOn = WeatherGatewayTimeoutException.class, maxRetries = 5, delay = 500, jitter = 500, maxDuration = 1000)
- public String statusOfYear() {
+ @Retry(maxDuration = 1000)
+ public String statusOfYear(){
if (counterStatusOfWeekend.addAndGet(1) <= 5) {
logTimeoutMessage(statusOfYearInstant);
statusOfYearInstant = Instant.now();
- throw new WeatherGatewayTimeoutException();
+ throw new RuntimeException();
}
- return "Status of the Year is unavailable.";
+ return "WeatherGateway Service Error";
}
private void logTimeoutMessage(Instant instant) {
http://git-wip-us.apache.org/repos/asf/tomee/blob/1396ab44/examples/mp-faulttolerance-retry/src/main/java/org/superbiz/rest/WeatherService.java
----------------------------------------------------------------------
diff --git a/examples/mp-faulttolerance-retry/src/main/java/org/superbiz/rest/WeatherService.java b/examples/mp-faulttolerance-retry/src/main/java/org/superbiz/rest/WeatherService.java
index f21bf8f..a793c5d 100644
--- a/examples/mp-faulttolerance-retry/src/main/java/org/superbiz/rest/WeatherService.java
+++ b/examples/mp-faulttolerance-retry/src/main/java/org/superbiz/rest/WeatherService.java
@@ -66,7 +66,7 @@ public class WeatherService {
public Response yearStatus() {
try {
return Response.ok().entity(weatherService.statusOfYear()).build();
- } catch (WeatherGatewayTimeoutException e) {
+ } catch (RuntimeException e) {
return Response.serverError().entity("WeatherGateway Service Timeout").build();
}
}
http://git-wip-us.apache.org/repos/asf/tomee/blob/1396ab44/examples/mp-faulttolerance-retry/src/test/java/org/superbiz/rest/WeatherServiceTest.java
----------------------------------------------------------------------
diff --git a/examples/mp-faulttolerance-retry/src/test/java/org/superbiz/rest/WeatherServiceTest.java b/examples/mp-faulttolerance-retry/src/test/java/org/superbiz/rest/WeatherServiceTest.java
index 96fab3d..c653d29 100644
--- a/examples/mp-faulttolerance-retry/src/test/java/org/superbiz/rest/WeatherServiceTest.java
+++ b/examples/mp-faulttolerance-retry/src/test/java/org/superbiz/rest/WeatherServiceTest.java
@@ -77,7 +77,7 @@ public class WeatherServiceTest {
public void testStatusOfMonth() {
WebTarget webTarget = this.client.target(this.base.toExternalForm());
Response response = webTarget.path("/weather/month/status").request().get();
- assertEquals("The Forecast for the Month is sunny most of the days", response.readEntity(String.class));
+ assertEquals("The Forecast for the Month is Sunny for most of the days", response.readEntity(String.class));
}
@Test