Skip to content

Commit b7bc301

Browse files
committed
Ensure that executions are always complete by default
1 parent 5c4ac7a commit b7bc301

File tree

5 files changed

+44
-27
lines changed

5 files changed

+44
-27
lines changed

src/main/java/net/jodah/failsafe/CircuitBreakerExecutor.java

+1-1
Original file line numberDiff line numberDiff line change
@@ -52,6 +52,6 @@ protected void onSuccess(ExecutionResult result) {
5252
@Override
5353
protected ExecutionResult onFailure(ExecutionResult result) {
5454
policy.recordExecutionFailure(execution);
55-
return result.withComplete();
55+
return result;
5656
}
5757
}

src/main/java/net/jodah/failsafe/ExecutionResult.java

+29-20
Original file line numberDiff line numberDiff line change
@@ -44,10 +44,11 @@ public class ExecutionResult {
4444
private final Boolean successAll;
4545

4646
/**
47-
* Records an initial execution result where {@code success} is set to true if {@code failure} is not null.
47+
* Records an initial execution result with {@code complete} true and {@code success} set to true if {@code failure}
48+
* is not null.
4849
*/
4950
public ExecutionResult(Object result, Throwable failure) {
50-
this(result, failure, false, 0, false, failure == null, failure == null);
51+
this(result, failure, false, 0, true, failure == null, failure == null);
5152
}
5253

5354
private ExecutionResult(Object result, Throwable failure, boolean nonResult, long waitNanos, boolean complete,
@@ -62,14 +63,14 @@ private ExecutionResult(Object result, Throwable failure, boolean nonResult, lon
6263
}
6364

6465
/**
65-
* Returns a an ExecutionResult with the {@code result} set, {@code completed} true and {@code success} true.
66+
* Returns a an ExecutionResult with the {@code result} set, {@code complete} true and {@code success} true.
6667
*/
6768
public static ExecutionResult success(Object result) {
68-
return new ExecutionResult(result, null);
69+
return new ExecutionResult(result, null, false, 0, true, true, true);
6970
}
7071

7172
/**
72-
* Returns a an ExecutionResult with the {@code failure} set, {@code completed} true and {@code success} false.
73+
* Returns a an ExecutionResult with the {@code failure} set, {@code complete} true and {@code success} false.
7374
*/
7475
public static ExecutionResult failure(Throwable failure) {
7576
return new ExecutionResult(null, failure, false, 0, true, false, false);
@@ -100,8 +101,8 @@ public boolean isSuccess() {
100101
}
101102

102103
/**
103-
* Returns a copy of the ExecutionResult with a non-result, and completed and success set to true. Returns {@code
104-
* this} if {@link #success} and {@link #result} are unchanged.
104+
* Returns a copy of the ExecutionResult with a non-result, and complete and success set to true. Returns {@code this}
105+
* if {@link #success} and {@link #result} are unchanged.
105106
*/
106107
ExecutionResult withNonResult() {
107108
return success && this.result == null && nonResult ?
@@ -110,30 +111,38 @@ ExecutionResult withNonResult() {
110111
}
111112

112113
/**
113-
* Returns a copy of the ExecutionResult with the {@code result} value, and completed and success set to true. Returns
114+
* Returns a copy of the ExecutionResult with the {@code result} value, and complete and success set to true. Returns
114115
* {@code this} if {@link #success} and {@link #result} are unchanged.
115116
*/
116117
public ExecutionResult withResult(Object result) {
117118
return success && ((this.result == null && result == null) || (this.result != null && this.result.equals(result))) ?
118119
this :
119120
new ExecutionResult(result, null, nonResult, waitNanos, true, true, successAll);
120121
}
122+
123+
/**
124+
* Returns a copy of the ExecutionResult with {@code complete} set to false, else this if nothing has changed.
125+
*/
126+
ExecutionResult withNotComplete() {
127+
return !this.complete ?
128+
this :
129+
new ExecutionResult(result, failure, nonResult, waitNanos, false, success, successAll);
130+
}
121131

122132
/**
123-
* Returns a copy of the ExecutionResult with the value set to true, else this if nothing has changed.
133+
* Returns a copy of the ExecutionResult with success value of {code false}.
124134
*/
125-
public ExecutionResult withComplete() {
126-
return this.complete ? this : new ExecutionResult(result, failure, nonResult, waitNanos, true, success, successAll);
135+
ExecutionResult withFailure() {
136+
return !this.success ? this : new ExecutionResult(result, failure, nonResult, waitNanos, complete, false, false);
127137
}
128138

129139
/**
130-
* Returns a copy of the ExecutionResult with the {@code completed} and {@code success} values.
140+
* Returns a copy of the ExecutionResult with the {@code complete} and {@code success} values of {@code true}.
131141
*/
132-
ExecutionResult with(boolean completed, boolean success) {
133-
return this.complete == completed && this.success == success ?
142+
ExecutionResult withSuccess() {
143+
return this.complete && this.success ?
134144
this :
135-
new ExecutionResult(result, failure, nonResult, waitNanos, completed, success,
136-
successAll == null ? success : success && successAll);
145+
new ExecutionResult(result, failure, nonResult, waitNanos, true, true, successAll);
137146
}
138147

139148
/**
@@ -146,12 +155,12 @@ public ExecutionResult withWaitNanos(long waitNanos) {
146155
}
147156

148157
/**
149-
* Returns a copy of the ExecutionResult with the {@code waitNanos}, {@code completed} and {@code success} values.
158+
* Returns a copy of the ExecutionResult with the {@code waitNanos}, {@code complete} and {@code success} values.
150159
*/
151-
public ExecutionResult with(long waitNanos, boolean completed, boolean success) {
152-
return this.waitNanos == waitNanos && this.complete == completed && this.success == success ?
160+
public ExecutionResult with(long waitNanos, boolean complete, boolean success) {
161+
return this.waitNanos == waitNanos && this.complete == complete && this.success == success ?
153162
this :
154-
new ExecutionResult(result, failure, nonResult, waitNanos, completed, success,
163+
new ExecutionResult(result, failure, nonResult, waitNanos, complete, success,
155164
successAll == null ? success : success && successAll);
156165
}
157166

src/main/java/net/jodah/failsafe/PolicyExecutor.java

+4-5
Original file line numberDiff line numberDiff line change
@@ -63,10 +63,10 @@ protected Supplier<ExecutionResult> supply(Supplier<ExecutionResult> supplier, S
6363
*/
6464
protected ExecutionResult postExecute(ExecutionResult result) {
6565
if (isFailure(result)) {
66-
result = onFailure(result.with(false, false));
66+
result = onFailure(result.withFailure());
6767
callFailureListener(result);
6868
} else {
69-
result = result.with(true, true);
69+
result = result.withSuccess();
7070
onSuccess(result);
7171
callSuccessListener(result);
7272
}
@@ -94,12 +94,11 @@ protected Supplier<CompletableFuture<ExecutionResult>> supplyAsync(
9494
protected CompletableFuture<ExecutionResult> postExecuteAsync(ExecutionResult result, Scheduler scheduler,
9595
FailsafeFuture<Object> future) {
9696
if (isFailure(result)) {
97-
result = result.with(false, false);
98-
return onFailureAsync(result, scheduler, future).whenComplete((postResult, error) -> {
97+
return onFailureAsync(result.withFailure(), scheduler, future).whenComplete((postResult, error) -> {
9998
callFailureListener(postResult);
10099
});
101100
} else {
102-
result = result.with(true, true);
101+
result = result.withSuccess();
103102
onSuccess(result);
104103
callSuccessListener(result);
105104
return CompletableFuture.completedFuture(result);

src/main/java/net/jodah/failsafe/RetryPolicyExecutor.java

+9
Original file line numberDiff line numberDiff line change
@@ -188,6 +188,15 @@ else if (retriesExceededListener != null && !success && retriesExceeded)
188188
return result.with(waitNanos, completed, success);
189189
}
190190

191+
/**
192+
* Defaults async executions to not be complete until {@link #onFailure(ExecutionResult) says they are}.
193+
*/
194+
@Override
195+
protected CompletableFuture<ExecutionResult> onFailureAsync(ExecutionResult result, Scheduler scheduler,
196+
FailsafeFuture<Object> future) {
197+
return super.onFailureAsync(result.withNotComplete(), scheduler, future);
198+
}
199+
191200
private long getFixedOrRandomDelayNanos(long waitNanos) {
192201
Duration delay = policy.getDelay();
193202
Duration delayMin = policy.getDelayMin();

src/main/java/net/jodah/failsafe/TimeoutExecutor.java

+1-1
Original file line numberDiff line numberDiff line change
@@ -44,7 +44,7 @@ protected ExecutionResult onFailure(ExecutionResult result) {
4444
// Handle async execution timeouts
4545
if (!(result.getFailure() instanceof TimeoutExceededException))
4646
result = ExecutionResult.failure(new TimeoutExceededException(policy));
47-
return result.withComplete();
47+
return result;
4848
}
4949

5050
/**

0 commit comments

Comments
 (0)