Skip to content

Commit 0ac2c5e

Browse files
authored
[Fix #950] Fix retry attemp limit (#951)
Signed-off-by: fjtirado <ftirados@redhat.com>
1 parent 1f676c5 commit 0ac2c5e

File tree

6 files changed

+37
-15
lines changed

6 files changed

+37
-15
lines changed

impl/core/src/main/java/io/serverlessworkflow/impl/executors/TryExecutor.java

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -182,17 +182,17 @@ private CompletableFuture<WorkflowModel> handleException(
182182
completable =
183183
completable
184184
.thenCompose(
185-
model -> retryIntervalExecutor.get().retry(workflow, taskContext, model))
185+
model ->
186+
retryIntervalExecutor
187+
.get()
188+
.retry(workflow, taskContext, model)
189+
.orElse(CompletableFuture.failedFuture(e)))
186190
.thenCompose(model -> doIt(workflow, taskContext, model));
187191
}
188192
}
189193
return completable;
190194
} else {
191-
if (e instanceof RuntimeException) {
192-
throw (RuntimeException) e;
193-
} else {
194-
throw new RuntimeException(e);
195-
}
195+
return CompletableFuture.failedFuture(e);
196196
}
197197
}
198198

impl/core/src/main/java/io/serverlessworkflow/impl/executors/retry/DefaultRetryExecutor.java

Lines changed: 4 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -44,19 +44,18 @@ public DefaultRetryExecutor(
4444
}
4545

4646
@Override
47-
public CompletableFuture<WorkflowModel> retry(
47+
public Optional<CompletableFuture<WorkflowModel>> retry(
4848
WorkflowContext workflowContext, TaskContext taskContext, WorkflowModel model) {
49-
CompletableFuture<WorkflowModel> completable = new CompletableFuture<>();
5049
short numAttempts = taskContext.retryAttempt();
5150
if (numAttempts++ < maxAttempts
5251
&& WorkflowUtils.whenExceptTest(
5352
whenFilter, exceptFilter, workflowContext, taskContext, model)) {
5453
taskContext.retryAttempt(numAttempts);
5554
Duration delay = intervalFunction.apply(workflowContext, taskContext, model, numAttempts);
55+
CompletableFuture<WorkflowModel> completable = new CompletableFuture<>();
5656
completable.completeOnTimeout(model, delay.toMillis(), TimeUnit.MILLISECONDS);
57-
} else {
58-
completable.complete(model);
57+
return Optional.of(completable);
5958
}
60-
return completable;
59+
return Optional.empty();
6160
}
6261
}

impl/core/src/main/java/io/serverlessworkflow/impl/executors/retry/RetryExecutor.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,9 +18,10 @@
1818
import io.serverlessworkflow.impl.TaskContext;
1919
import io.serverlessworkflow.impl.WorkflowContext;
2020
import io.serverlessworkflow.impl.WorkflowModel;
21+
import java.util.Optional;
2122
import java.util.concurrent.CompletableFuture;
2223

2324
public interface RetryExecutor {
24-
CompletableFuture<WorkflowModel> retry(
25+
Optional<CompletableFuture<WorkflowModel>> retry(
2526
WorkflowContext worfklowContext, TaskContext taskContext, WorkflowModel model);
2627
}

impl/test/src/test/java/io/serverlessworkflow/impl/test/RetryTest.java

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,9 +16,11 @@
1616
package io.serverlessworkflow.impl.test;
1717

1818
import static io.serverlessworkflow.api.WorkflowReader.readWorkflowFromClasspath;
19+
import static org.assertj.core.api.Assertions.assertThatThrownBy;
1920

2021
import com.fasterxml.jackson.databind.JsonNode;
2122
import io.serverlessworkflow.impl.WorkflowApplication;
23+
import io.serverlessworkflow.impl.WorkflowException;
2224
import io.serverlessworkflow.impl.WorkflowModel;
2325
import io.serverlessworkflow.impl.jackson.JsonUtils;
2426
import java.io.IOException;
@@ -32,6 +34,7 @@
3234
import org.junit.jupiter.api.AfterEach;
3335
import org.junit.jupiter.api.BeforeAll;
3436
import org.junit.jupiter.api.BeforeEach;
37+
import org.junit.jupiter.api.Test;
3538
import org.junit.jupiter.params.ParameterizedTest;
3639
import org.junit.jupiter.params.provider.ValueSource;
3740

@@ -84,4 +87,23 @@ void testRetry(String path) throws IOException {
8487
.atMost(Duration.ofSeconds(1))
8588
.until(() -> future.join().as(JsonNode.class).orElseThrow().equals(result));
8689
}
90+
91+
@Test
92+
void testRetryEnd() throws IOException {
93+
apiServer.enqueue(new MockResponse().setResponseCode(404));
94+
apiServer.enqueue(new MockResponse().setResponseCode(404));
95+
apiServer.enqueue(new MockResponse().setResponseCode(404));
96+
apiServer.enqueue(new MockResponse().setResponseCode(404));
97+
apiServer.enqueue(new MockResponse().setResponseCode(404));
98+
apiServer.enqueue(new MockResponse().setResponseCode(404));
99+
assertThatThrownBy(
100+
() ->
101+
app.workflowDefinition(
102+
readWorkflowFromClasspath(
103+
"workflows-samples/try-catch-retry-reusable.yaml"))
104+
.instance(Map.of())
105+
.start()
106+
.join())
107+
.hasCauseInstanceOf(WorkflowException.class);
108+
}
87109
}

impl/test/src/test/resources/workflows-samples/try-catch-retry-inline.yaml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
document:
22
dsl: '1.0.0'
33
namespace: default
4-
name: try-catch-retry
4+
name: try-catch-retry-inline
55
version: '0.1.0'
66
do:
77
- tryGetPet:

impl/test/src/test/resources/workflows-samples/try-catch-retry-reusable.yaml

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,15 +1,15 @@
11
document:
22
dsl: '1.0.0'
33
namespace: default
4-
name: try-catch-retry
4+
name: try-catch-retry-reusable
55
version: '0.1.0'
66
use:
77
retries:
88
default:
99
delay:
1010
milliseconds: 10
1111
backoff:
12-
exponential: {}
12+
constant: {}
1313
limit:
1414
attempt:
1515
count: 5

0 commit comments

Comments
 (0)