Skip to content

Commit 65a2a3d

Browse files
authored
add more iteration to map example (#267)
1 parent 6ddcedf commit 65a2a3d

3 files changed

Lines changed: 22 additions & 25 deletions

File tree

examples/src/main/java/software/amazon/lambda/durable/examples/map/ComplexMapExample.java

Lines changed: 6 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -5,11 +5,11 @@
55
import java.time.Duration;
66
import java.util.List;
77
import java.util.stream.Collectors;
8+
import java.util.stream.IntStream;
89
import software.amazon.lambda.durable.DurableContext;
910
import software.amazon.lambda.durable.DurableHandler;
1011
import software.amazon.lambda.durable.config.CompletionConfig;
1112
import software.amazon.lambda.durable.config.MapConfig;
12-
import software.amazon.lambda.durable.examples.types.GreetingRequest;
1313

1414
/**
1515
* Example demonstrating advanced map features: wait operations inside branches, error handling, and early termination.
@@ -20,19 +20,18 @@
2020
* <li>Early termination with {@code minSuccessful(2)} — finds 2 healthy servers then stops
2121
* </ol>
2222
*/
23-
public class ComplexMapExample extends DurableHandler<GreetingRequest, String> {
23+
public class ComplexMapExample extends DurableHandler<Integer, String> {
2424

2525
@Override
26-
public String handleRequest(GreetingRequest input, DurableContext context) {
27-
var name = input.getName();
28-
context.getLogger().info("Starting complex map example for {}", name);
26+
public String handleRequest(Integer input, DurableContext context) {
27+
context.getLogger().info("Starting complex map example with {} items", input);
2928

3029
// Part 1: Concurrent map with step + wait inside each branch
31-
var orderIds = List.of("order-1", "order-2", "order-3");
30+
var orderIds = IntStream.range(1, input + 1).mapToObj(x -> "order-" + x).collect(Collectors.toList());
3231

3332
var orderResult = context.map("process-orders", orderIds, String.class, (orderId, index, ctx) -> {
3433
// Step 1: validate the order
35-
var validated = ctx.step("validate-" + index, String.class, stepCtx -> "validated:" + orderId + ":" + name);
34+
var validated = ctx.step("validate-" + index, String.class, stepCtx -> "validated:" + orderId);
3635

3736
// Wait between stages (simulates a cooldown or external dependency)
3837
ctx.wait("cooldown-" + index, Duration.ofSeconds(1));

examples/src/test/java/software/amazon/lambda/durable/examples/CloudBasedIntegrationTest.java

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -578,17 +578,17 @@ void testSimpleMapExample() {
578578

579579
@Test
580580
void testComplexMapExample() {
581-
var runner = CloudDurableTestRunner.create(arn("complex-map-example"), GreetingRequest.class, String.class);
582-
var result = runner.run(new GreetingRequest("Alice"));
581+
var runner = CloudDurableTestRunner.create(arn("complex-map-example"), Integer.class, String.class);
582+
var result = runner.run(100);
583583

584584
assertEquals(ExecutionStatus.SUCCEEDED, result.getStatus());
585585
var output = result.getResult(String.class);
586586
assertNotNull(output);
587587

588588
// Part 1: Concurrent order processing with step + wait + step
589-
assertTrue(output.contains("done:validated:order-1:Alice"));
590-
assertTrue(output.contains("done:validated:order-2:Alice"));
591-
assertTrue(output.contains("done:validated:order-3:Alice"));
589+
assertTrue(output.contains("done:validated:order-1"));
590+
assertTrue(output.contains("done:validated:order-2"));
591+
assertTrue(output.contains("done:validated:order-100"));
592592

593593
// Part 2: Early termination — find 2 healthy servers then stop
594594
assertTrue(output.contains("healthy"));

examples/src/test/java/software/amazon/lambda/durable/examples/map/ComplexMapExampleTest.java

Lines changed: 11 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,6 @@
55
import static org.junit.jupiter.api.Assertions.*;
66

77
import org.junit.jupiter.api.Test;
8-
import software.amazon.lambda.durable.examples.types.GreetingRequest;
98
import software.amazon.lambda.durable.model.ExecutionStatus;
109
import software.amazon.lambda.durable.testing.LocalDurableTestRunner;
1110

@@ -14,17 +13,17 @@ class ComplexMapExampleTest {
1413
@Test
1514
void testComplexMapExample() {
1615
var handler = new ComplexMapExample();
17-
var runner = LocalDurableTestRunner.create(GreetingRequest.class, handler);
16+
var runner = LocalDurableTestRunner.create(Integer.class, handler);
1817

19-
var result = runner.runUntilComplete(new GreetingRequest("Alice"));
18+
var result = runner.runUntilComplete(50);
2019

2120
assertEquals(ExecutionStatus.SUCCEEDED, result.getStatus());
2221
var output = result.getResult(String.class);
2322

2423
// Part 1: all 3 orders processed with step + wait + step
25-
assertTrue(output.contains("done:validated:order-1:Alice"));
26-
assertTrue(output.contains("done:validated:order-2:Alice"));
27-
assertTrue(output.contains("done:validated:order-3:Alice"));
24+
assertTrue(output.contains("done:validated:order-1"));
25+
assertTrue(output.contains("done:validated:order-2"));
26+
assertTrue(output.contains("done:validated:order-50"));
2827

2928
// Part 2: early termination after 2 healthy servers
3029
assertTrue(output.contains("reason=MIN_SUCCESSFUL_REACHED"));
@@ -34,21 +33,20 @@ void testComplexMapExample() {
3433
@Test
3534
void testReplay() {
3635
var handler = new ComplexMapExample();
37-
var runner = LocalDurableTestRunner.create(GreetingRequest.class, handler);
36+
var runner = LocalDurableTestRunner.create(Integer.class, handler);
3837

39-
var input = new GreetingRequest("Bob");
40-
var result1 = runner.runUntilComplete(input);
38+
var result1 = runner.runUntilComplete(50);
4139
assertEquals(ExecutionStatus.SUCCEEDED, result1.getStatus());
4240

4341
// Replay — should use cached results.
4442
// Structural assertion because the first map has wait() inside branches with unlimited
4543
// concurrency, which can cause non-deterministic thread scheduling across invocations.
46-
var result2 = runner.runUntilComplete(input);
44+
var result2 = runner.runUntilComplete(50);
4745
assertEquals(ExecutionStatus.SUCCEEDED, result2.getStatus());
4846
var output = result2.getResult(String.class);
49-
assertTrue(output.contains("done:validated:order-1:Bob"));
50-
assertTrue(output.contains("done:validated:order-2:Bob"));
51-
assertTrue(output.contains("done:validated:order-3:Bob"));
47+
assertTrue(output.contains("done:validated:order-1"));
48+
assertTrue(output.contains("done:validated:order-2"));
49+
assertTrue(output.contains("done:validated:order-50"));
5250
assertTrue(output.contains("reason=MIN_SUCCESSFUL_REACHED"));
5351
assertTrue(output.contains("healthy"));
5452
}

0 commit comments

Comments
 (0)