Skip to content

Commit 311ff96

Browse files
committed
Support creating a builder based on existing policy config
- Adds builder factory methods that accept an existing policy config - Relaxes some of the illegal state assertions inside RetryPolicyBuilder, so that retry policies can be reconfigured with different durations, replacing previous configuration - Relaxes the requirement that a jitter duration be configured after a delay. If a jitter duration is specified without a delay, the jitter will be ignored.
1 parent 36c4680 commit 311ff96

15 files changed

+364
-80
lines changed

CHANGELOG.md

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,10 @@
1+
# 3.0.1
2+
3+
### Improvements
4+
5+
- Issue #310 - Added `.builder(PolicyConfig)` methods to each of the policy interfaces, to allow new policies to be built from existing config.
6+
- Issue #251 - Relaxed the illegal state validation in `RetryPolicyBuilder` to allow different types of delays to be configured, replacing previous configuration. Also removed the requirement that a jitter duration be configured after a delay.
7+
18
# 3.0
29

310

src/main/java/dev/failsafe/CircuitBreaker.java

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -65,6 +65,13 @@ static <R> CircuitBreakerBuilder<R> builder() {
6565
return new CircuitBreakerBuilder<>();
6666
}
6767

68+
/**
69+
* Creates a new CircuitBreakerBuilder that will be based on the {@code config}.
70+
*/
71+
static <R> CircuitBreakerBuilder<R> builder(CircuitBreakerConfig<R> config) {
72+
return new CircuitBreakerBuilder<>(config);
73+
}
74+
6875
/**
6976
* Creates a count based CircuitBreaker that opens after a {@link CircuitBreakerBuilder#withFailureThreshold(int)
7077
* single failure}, closes after a {@link CircuitBreakerBuilder#withSuccessThreshold(int) single success}, and has a 1

src/main/java/dev/failsafe/CircuitBreakerBuilder.java

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -60,6 +60,10 @@ public class CircuitBreakerBuilder<R>
6060
config.failureThresholdingCapacity = 1;
6161
}
6262

63+
CircuitBreakerBuilder(CircuitBreakerConfig<R> config) {
64+
super(new CircuitBreakerConfig<>(config));
65+
}
66+
6367
/**
6468
* Builds a new {@link CircuitBreaker} using the builder's configuration.
6569
*/
@@ -108,7 +112,7 @@ public CircuitBreakerBuilder<R> onOpen(EventListener<CircuitBreakerStateChangedE
108112
*/
109113
public CircuitBreakerBuilder<R> withDelay(Duration delay) {
110114
Assert.notNull(delay, "delay");
111-
Assert.isTrue(delay.toNanos() >= 0, "delay must be positive");
115+
Assert.isTrue(delay.toNanos() >= 0, "delay must be >= 0");
112116
config.delay = delay;
113117
return this;
114118
}

src/main/java/dev/failsafe/Fallback.java

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -39,6 +39,13 @@
3939
* @see FallbackBuilder
4040
*/
4141
public interface Fallback<R> extends Policy<R> {
42+
/**
43+
* Creates a new FallbackBuilder that will be based on the {@code config}.
44+
*/
45+
static <R> FallbackBuilder<R> builder(FallbackConfig<R> config) {
46+
return new FallbackBuilder<>(config);
47+
}
48+
4249
/**
4350
* Returns the {@code fallback} to be executed if execution fails.
4451
*

src/main/java/dev/failsafe/FallbackBuilder.java

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -58,6 +58,10 @@ public class FallbackBuilder<R> extends FailurePolicyBuilder<FallbackBuilder<R>,
5858
config.fallbackStage = fallbackStage;
5959
}
6060

61+
FallbackBuilder(FallbackConfig<R> config) {
62+
super(new FallbackConfig<>(config));
63+
}
64+
6165
/**
6266
* Builds a new {@link Fallback} using the builder's configuration.
6367
*/
@@ -69,6 +73,8 @@ public Fallback<R> build() {
6973
* Registers the {@code listener} to be called when the last execution attempt prior to the fallback failed. You can
7074
* also use {@link #onFailure(EventListener) onFailure} to determine when the fallback attempt also fails.
7175
* <p>Note: Any exceptions that are thrown from within the {@code listener} are ignored.</p>
76+
*
77+
* @throws NullPointerException if {@code listener} is null
7278
*/
7379
public FallbackBuilder<R> onFailedAttempt(EventListener<ExecutionAttemptedEvent<R>> listener) {
7480
config.failedAttemptListener = Assert.notNull(listener, "listener");

src/main/java/dev/failsafe/RetryPolicy.java

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,13 @@ static <R> RetryPolicyBuilder<R> builder() {
3535
return new RetryPolicyBuilder<>();
3636
}
3737

38+
/**
39+
* Creates a new RetryPolicyBuilder that will be based on the {@code config}.
40+
*/
41+
static <R> RetryPolicyBuilder<R> builder(RetryPolicyConfig<R> config) {
42+
return new RetryPolicyBuilder<>(config);
43+
}
44+
3845
/**
3946
* Creates a RetryPolicy that allows 3 execution attempts max with no delay.
4047
*/

src/main/java/dev/failsafe/RetryPolicyBuilder.java

Lines changed: 96 additions & 51 deletions
Large diffs are not rendered by default.

src/main/java/dev/failsafe/Timeout.java

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -61,6 +61,13 @@ static <R> TimeoutBuilder<R> builder(Duration timeout) {
6161
return new TimeoutBuilder<>(timeout);
6262
}
6363

64+
/**
65+
* Creates a new TimeoutBuilder that will be based on the {@code config}.
66+
*/
67+
static <R> TimeoutBuilder<R> builder(TimeoutConfig<R> config) {
68+
return new TimeoutBuilder<>(config);
69+
}
70+
6471
/**
6572
* Returns a {@link Timeout} that fails an execution with {@link TimeoutExceededException TimeoutExceededException} if
6673
* it exceeds the {@code timeout}. Alias for {@code Timeout.builder(timeout).build()}. To configure other options on a

src/main/java/dev/failsafe/TimeoutBuilder.java

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -36,6 +36,10 @@ public class TimeoutBuilder<R> extends PolicyBuilder<TimeoutBuilder<R>, TimeoutC
3636
super(new TimeoutConfig<>(timeout, false));
3737
}
3838

39+
TimeoutBuilder(TimeoutConfig<R> config) {
40+
super(new TimeoutConfig<>(config));
41+
}
42+
3943
/**
4044
* Builds a new {@link Timeout} using the builder's configuration.
4145
*/

src/main/java/dev/failsafe/internal/RetryPolicyExecutor.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -226,7 +226,8 @@ public ExecutionResult<R> onFailure(ExecutionContext<R> context, ExecutionResult
226226
lastDelayNanos = delayNanos;
227227
}
228228

229-
delayNanos = adjustForJitter(delayNanos);
229+
if (delayNanos != 0)
230+
delayNanos = adjustForJitter(delayNanos);
230231
long elapsedNanos = context.getElapsedTime().toNanos();
231232
delayNanos = adjustForMaxDuration(delayNanos, elapsedNanos);
232233

0 commit comments

Comments
 (0)