From c2d029bf275ace84dd6563861f50c2baaccb143a Mon Sep 17 00:00:00 2001 From: Shreyas Gopalakrishna Date: Tue, 5 Apr 2022 17:58:30 -0500 Subject: [PATCH 1/5] Added custom status support --- .../durabletask/OrchestrationRunner.java | 13 ++++++++----- .../durabletask/TaskOrchestrationContext.java | 2 ++ .../TaskOrchestrationExecutor.java | 19 +++++++++++++++++++ 3 files changed, 29 insertions(+), 5 deletions(-) diff --git a/sdk/src/main/java/com/microsoft/durabletask/OrchestrationRunner.java b/sdk/src/main/java/com/microsoft/durabletask/OrchestrationRunner.java index cbec349a..da7434c3 100644 --- a/sdk/src/main/java/com/microsoft/durabletask/OrchestrationRunner.java +++ b/sdk/src/main/java/com/microsoft/durabletask/OrchestrationRunner.java @@ -3,6 +3,7 @@ package com.microsoft.durabletask; import com.google.protobuf.InvalidProtocolBufferException; +import com.google.protobuf.StringValue; import com.microsoft.durabletask.protobuf.OrchestratorService; import java.util.Base64; @@ -88,11 +89,13 @@ public TaskOrchestration create() { orchestratorRequest.getNewEventsList()); // TODO: Need to get custom status from executor - OrchestratorService.OrchestratorResponse response = OrchestratorService.OrchestratorResponse.newBuilder() - .setInstanceId(orchestratorRequest.getInstanceId()) - .addAllActions(actions) - .build(); - + OrchestratorService.OrchestratorResponse.Builder responseBuilder = OrchestratorService.OrchestratorResponse.newBuilder(); + responseBuilder.setInstanceId(orchestratorRequest.getInstanceId()); + responseBuilder.addAllActions(actions); + if(taskOrchestrationExecutor.getCustomStatus() != null) { + responseBuilder.setCustomStatus(StringValue.of(taskOrchestrationExecutor.getCustomStatus())); + } + OrchestratorService.OrchestratorResponse response = responseBuilder.build(); return response.toByteArray(); } } diff --git a/sdk/src/main/java/com/microsoft/durabletask/TaskOrchestrationContext.java b/sdk/src/main/java/com/microsoft/durabletask/TaskOrchestrationContext.java index 486df329..8d665a1b 100644 --- a/sdk/src/main/java/com/microsoft/durabletask/TaskOrchestrationContext.java +++ b/sdk/src/main/java/com/microsoft/durabletask/TaskOrchestrationContext.java @@ -102,4 +102,6 @@ default Task waitForExternalEvent(String name, Class dataType) { throw new RuntimeException("An unexpected exception was throw while waiting for an external event.", e); } } + + void setCustomStatus(@Nullable Object input); } diff --git a/sdk/src/main/java/com/microsoft/durabletask/TaskOrchestrationExecutor.java b/sdk/src/main/java/com/microsoft/durabletask/TaskOrchestrationExecutor.java index acba366a..9c0c1cf4 100644 --- a/sdk/src/main/java/com/microsoft/durabletask/TaskOrchestrationExecutor.java +++ b/sdk/src/main/java/com/microsoft/durabletask/TaskOrchestrationExecutor.java @@ -24,6 +24,7 @@ public class TaskOrchestrationExecutor { private final HashMap orchestrationFactories; private final DataConverter dataConverter; private final Logger logger; + private ContextImplTask wrapperContext; public TaskOrchestrationExecutor( HashMap orchestrationFactories, @@ -36,6 +37,7 @@ public TaskOrchestrationExecutor( public Collection execute(List pastEvents, List newEvents) { ContextImplTask context = new ContextImplTask(pastEvents, newEvents); + this.wrapperContext = context; boolean completed = false; try { @@ -60,6 +62,11 @@ public Collection execute(List pastEvents, Lis return context.pendingActions.values(); } + public @Nullable String getCustomStatus() + { + return this.wrapperContext.getCustomStatus(); + } + private class ContextImplTask implements TaskOrchestrationContext { private String orchestratorName; @@ -82,6 +89,8 @@ private class ContextImplTask implements TaskOrchestrationContext { private Object continuedAsNewInput; private boolean preserveUnprocessedEvents; + private Object customStatus; + public ContextImplTask(List pastEvents, List newEvents) { this.historyEventPlayer = new OrchestrationHistoryIterator(pastEvents, newEvents); } @@ -132,6 +141,16 @@ private void setCurrentInstant(Instant instant) { this.currentInstant = instant; } + private @Nullable String getCustomStatus() + { + return this.dataConverter.serialize(this.customStatus); + } + + @Override + public void setCustomStatus(@Nullable Object customStatus) { + this.customStatus = customStatus; + } + @Override public boolean getIsReplaying() { return this.isReplaying; From 6088e3b465d09f11707f8d8d0e6e1b59bc97b9fc Mon Sep 17 00:00:00 2001 From: Shreyas Gopalakrishna Date: Wed, 6 Apr 2022 11:43:35 -0500 Subject: [PATCH 2/5] Integration tests for custom status support --- .../durabletask/DurableTaskGrpcWorker.java | 13 ++++--- .../durabletask/IntegrationTests.java | 36 +++++++++++++++++-- 2 files changed, 41 insertions(+), 8 deletions(-) diff --git a/sdk/src/main/java/com/microsoft/durabletask/DurableTaskGrpcWorker.java b/sdk/src/main/java/com/microsoft/durabletask/DurableTaskGrpcWorker.java index cab99131..a756191d 100644 --- a/sdk/src/main/java/com/microsoft/durabletask/DurableTaskGrpcWorker.java +++ b/sdk/src/main/java/com/microsoft/durabletask/DurableTaskGrpcWorker.java @@ -4,6 +4,7 @@ import com.google.protobuf.StringValue; +import com.microsoft.durabletask.protobuf.OrchestratorService; import com.microsoft.durabletask.protobuf.TaskHubSidecarServiceGrpc; import com.microsoft.durabletask.protobuf.OrchestratorService.*; import com.microsoft.durabletask.protobuf.OrchestratorService.WorkItem.RequestCase; @@ -111,11 +112,13 @@ public void runAndBlock() throws InterruptedException { orchestratorRequest.getPastEventsList(), orchestratorRequest.getNewEventsList()); - // TODO: Need to get custom status from executor - OrchestratorResponse response = OrchestratorResponse.newBuilder() - .setInstanceId(orchestratorRequest.getInstanceId()) - .addAllActions(actions) - .build(); + OrchestratorService.OrchestratorResponse.Builder responseBuilder = OrchestratorService.OrchestratorResponse.newBuilder(); + responseBuilder.setInstanceId(orchestratorRequest.getInstanceId()); + responseBuilder.addAllActions(actions); + if(taskOrchestrationExecutor.getCustomStatus() != null) { + responseBuilder.setCustomStatus(StringValue.of(taskOrchestrationExecutor.getCustomStatus())); + } + OrchestratorService.OrchestratorResponse response = responseBuilder.build(); this.sidecarClient.completeOrchestratorTask(response); } else if (requestType == RequestCase.ACTIVITYREQUEST) { diff --git a/sdk/src/test/java/com/microsoft/durabletask/IntegrationTests.java b/sdk/src/test/java/com/microsoft/durabletask/IntegrationTests.java index 2c8ab878..2a8b7bca 100644 --- a/sdk/src/test/java/com/microsoft/durabletask/IntegrationTests.java +++ b/sdk/src/test/java/com/microsoft/durabletask/IntegrationTests.java @@ -10,9 +10,7 @@ import java.io.IOException; import java.time.Duration; import java.time.Instant; -import java.util.ArrayList; -import java.util.Collections; -import java.util.List; +import java.util.*; import java.util.stream.Collectors; import java.util.stream.IntStream; @@ -441,4 +439,36 @@ void externalEventsWithTimeouts(boolean raiseEvent) throws IOException { } } } + + @Test + void setCustomStatus() { + final String orchestratorName = "SetCustomStatus"; + + DurableTaskGrpcWorker worker = this.createWorkerBuilder() + .addOrchestrator(orchestratorName, ctx -> { + ctx.setCustomStatus("Started!"); + Object customStatus = ctx.waitForExternalEvent("StatusEvent", Duration.ofSeconds(3), Object.class).get(); + ctx.setCustomStatus(customStatus); + }) + .buildAndStart(); + + DurableTaskClient client = DurableTaskGrpcClient.newBuilder().build(); + try (worker; client) { + String instanceId = client.scheduleNewOrchestrationInstance(orchestratorName); + + OrchestrationMetadata metadata = client.waitForInstanceStart(instanceId, defaultTimeout, true); + assertNotNull(metadata); + assertEquals("Started!", metadata.readCustomStatusAs(String.class)); + + Map payload = new HashMap(){{ + put("Hello",45); + }}; + client.raiseEvent(metadata.getInstanceId(), "StatusEvent", payload); + + metadata = client.waitForInstanceCompletion(instanceId, defaultTimeout, true); + assertNotNull(metadata); + assertEquals(OrchestrationRuntimeStatus.COMPLETED, metadata.getRuntimeStatus()); + assertEquals(payload, metadata.readCustomStatusAs(payload.getClass())); + } + } } From 4beb4a1662817714c10edcb94f3b3a609911abee Mon Sep 17 00:00:00 2001 From: Shreyas Gopalakrishna Date: Thu, 7 Apr 2022 12:37:05 -0500 Subject: [PATCH 3/5] Added clear custom status and tests --- .../durabletask/DurableTaskGrpcWorker.java | 14 +++---- .../durabletask/OrchestrationRunner.java | 16 +++----- .../durabletask/TaskOrchestrationContext.java | 4 +- .../TaskOrchestrationExecutor.java | 23 +++++------ .../durabletask/TaskOrchestratorResult.java | 33 +++++++++++++++ .../durabletask/IntegrationTests.java | 40 +++++++++++++++---- 6 files changed, 92 insertions(+), 38 deletions(-) create mode 100644 sdk/src/main/java/com/microsoft/durabletask/TaskOrchestratorResult.java diff --git a/sdk/src/main/java/com/microsoft/durabletask/DurableTaskGrpcWorker.java b/sdk/src/main/java/com/microsoft/durabletask/DurableTaskGrpcWorker.java index a756191d..098a17c9 100644 --- a/sdk/src/main/java/com/microsoft/durabletask/DurableTaskGrpcWorker.java +++ b/sdk/src/main/java/com/microsoft/durabletask/DurableTaskGrpcWorker.java @@ -108,17 +108,15 @@ public void runAndBlock() throws InterruptedException { // TODO: Run this on a worker pool thread: https://www.baeldung.com/thread-pool-java-and-guava // TODO: Error handling - Collection actions = taskOrchestrationExecutor.execute( + TaskOrchestratorResult taskOrchestratorResult = taskOrchestrationExecutor.execute( orchestratorRequest.getPastEventsList(), orchestratorRequest.getNewEventsList()); - OrchestratorService.OrchestratorResponse.Builder responseBuilder = OrchestratorService.OrchestratorResponse.newBuilder(); - responseBuilder.setInstanceId(orchestratorRequest.getInstanceId()); - responseBuilder.addAllActions(actions); - if(taskOrchestrationExecutor.getCustomStatus() != null) { - responseBuilder.setCustomStatus(StringValue.of(taskOrchestrationExecutor.getCustomStatus())); - } - OrchestratorService.OrchestratorResponse response = responseBuilder.build(); + OrchestratorResponse response = OrchestratorResponse.newBuilder() + .setInstanceId(orchestratorRequest.getInstanceId()) + .addAllActions(taskOrchestratorResult.getActions()) + .setCustomStatus(StringValue.of(taskOrchestratorResult.getCustomStatus())) + .build(); this.sidecarClient.completeOrchestratorTask(response); } else if (requestType == RequestCase.ACTIVITYREQUEST) { diff --git a/sdk/src/main/java/com/microsoft/durabletask/OrchestrationRunner.java b/sdk/src/main/java/com/microsoft/durabletask/OrchestrationRunner.java index da7434c3..a62e79c2 100644 --- a/sdk/src/main/java/com/microsoft/durabletask/OrchestrationRunner.java +++ b/sdk/src/main/java/com/microsoft/durabletask/OrchestrationRunner.java @@ -7,7 +7,6 @@ import com.microsoft.durabletask.protobuf.OrchestratorService; import java.util.Base64; -import java.util.Collection; import java.util.HashMap; import java.util.logging.Logger; @@ -84,18 +83,15 @@ public TaskOrchestration create() { logger); // TODO: Error handling - Collection actions = taskOrchestrationExecutor.execute( + TaskOrchestratorResult taskOrchestratorResult = taskOrchestrationExecutor.execute( orchestratorRequest.getPastEventsList(), orchestratorRequest.getNewEventsList()); - // TODO: Need to get custom status from executor - OrchestratorService.OrchestratorResponse.Builder responseBuilder = OrchestratorService.OrchestratorResponse.newBuilder(); - responseBuilder.setInstanceId(orchestratorRequest.getInstanceId()); - responseBuilder.addAllActions(actions); - if(taskOrchestrationExecutor.getCustomStatus() != null) { - responseBuilder.setCustomStatus(StringValue.of(taskOrchestrationExecutor.getCustomStatus())); - } - OrchestratorService.OrchestratorResponse response = responseBuilder.build(); + OrchestratorService.OrchestratorResponse response = OrchestratorService.OrchestratorResponse.newBuilder() + .setInstanceId(orchestratorRequest.getInstanceId()) + .addAllActions(taskOrchestratorResult.getActions()) + .setCustomStatus(StringValue.of(taskOrchestratorResult.getCustomStatus())) + .build(); return response.toByteArray(); } } diff --git a/sdk/src/main/java/com/microsoft/durabletask/TaskOrchestrationContext.java b/sdk/src/main/java/com/microsoft/durabletask/TaskOrchestrationContext.java index 8d665a1b..2812cac1 100644 --- a/sdk/src/main/java/com/microsoft/durabletask/TaskOrchestrationContext.java +++ b/sdk/src/main/java/com/microsoft/durabletask/TaskOrchestrationContext.java @@ -103,5 +103,7 @@ default Task waitForExternalEvent(String name, Class dataType) { } } - void setCustomStatus(@Nullable Object input); + void setCustomStatus(Object customStatus); + + void clearCustomStatus(); } diff --git a/sdk/src/main/java/com/microsoft/durabletask/TaskOrchestrationExecutor.java b/sdk/src/main/java/com/microsoft/durabletask/TaskOrchestrationExecutor.java index 9c0c1cf4..65a6df2d 100644 --- a/sdk/src/main/java/com/microsoft/durabletask/TaskOrchestrationExecutor.java +++ b/sdk/src/main/java/com/microsoft/durabletask/TaskOrchestrationExecutor.java @@ -21,10 +21,10 @@ public class TaskOrchestrationExecutor { + private static final String EMPTY_STRING = ""; private final HashMap orchestrationFactories; private final DataConverter dataConverter; private final Logger logger; - private ContextImplTask wrapperContext; public TaskOrchestrationExecutor( HashMap orchestrationFactories, @@ -35,9 +35,8 @@ public TaskOrchestrationExecutor( this.logger = logger; } - public Collection execute(List pastEvents, List newEvents) { + public TaskOrchestratorResult execute(List pastEvents, List newEvents) { ContextImplTask context = new ContextImplTask(pastEvents, newEvents); - this.wrapperContext = context; boolean completed = false; try { @@ -59,12 +58,7 @@ public Collection execute(List pastEvents, Lis context.complete(null); } - return context.pendingActions.values(); - } - - public @Nullable String getCustomStatus() - { - return this.wrapperContext.getCustomStatus(); + return new TaskOrchestratorResult(context.pendingActions.values(), context.getCustomStatus()); } private class ContextImplTask implements TaskOrchestrationContext { @@ -141,16 +135,21 @@ private void setCurrentInstant(Instant instant) { this.currentInstant = instant; } - private @Nullable String getCustomStatus() + private String getCustomStatus() { - return this.dataConverter.serialize(this.customStatus); + return this.customStatus != null ? this.dataConverter.serialize(this.customStatus) : EMPTY_STRING; } @Override - public void setCustomStatus(@Nullable Object customStatus) { + public void setCustomStatus(Object customStatus) { this.customStatus = customStatus; } + @Override + public void clearCustomStatus() { + setCustomStatus(EMPTY_STRING); + } + @Override public boolean getIsReplaying() { return this.isReplaying; diff --git a/sdk/src/main/java/com/microsoft/durabletask/TaskOrchestratorResult.java b/sdk/src/main/java/com/microsoft/durabletask/TaskOrchestratorResult.java new file mode 100644 index 00000000..32087f32 --- /dev/null +++ b/sdk/src/main/java/com/microsoft/durabletask/TaskOrchestratorResult.java @@ -0,0 +1,33 @@ +package com.microsoft.durabletask; + +import com.microsoft.durabletask.protobuf.OrchestratorService; + +import java.util.Collection; + +public class TaskOrchestratorResult { + + private Collection actions; + + private String customStatus; + + public TaskOrchestratorResult(Collection actions, String customStatus) { + this.actions = actions; + this.customStatus = customStatus; + } + + public Collection getActions() { + return actions; + } + + public void setActions(Collection actions) { + this.actions = actions; + } + + public String getCustomStatus() { + return customStatus; + } + + public void setCustomStatus(String customStatus) { + this.customStatus = customStatus; + } +} diff --git a/sdk/src/test/java/com/microsoft/durabletask/IntegrationTests.java b/sdk/src/test/java/com/microsoft/durabletask/IntegrationTests.java index 2a8b7bca..e535f068 100644 --- a/sdk/src/test/java/com/microsoft/durabletask/IntegrationTests.java +++ b/sdk/src/test/java/com/microsoft/durabletask/IntegrationTests.java @@ -2,11 +2,6 @@ // Licensed under the MIT License. package com.microsoft.durabletask; -import static org.junit.jupiter.api.Assertions.assertEquals; -import static org.junit.jupiter.api.Assertions.assertFalse; -import static org.junit.jupiter.api.Assertions.assertNotNull; -import static org.junit.jupiter.api.Assertions.assertTrue; - import java.io.IOException; import java.time.Duration; import java.time.Instant; @@ -20,6 +15,8 @@ import org.junit.jupiter.params.ParameterizedTest; import org.junit.jupiter.params.provider.ValueSource; +import static org.junit.jupiter.api.Assertions.*; + /** * These integration tests are designed to exercise the core, high-level features of * the Durable Task programming model. @@ -447,7 +444,7 @@ void setCustomStatus() { DurableTaskGrpcWorker worker = this.createWorkerBuilder() .addOrchestrator(orchestratorName, ctx -> { ctx.setCustomStatus("Started!"); - Object customStatus = ctx.waitForExternalEvent("StatusEvent", Duration.ofSeconds(3), Object.class).get(); + Object customStatus = ctx.waitForExternalEvent("StatusEvent", Object.class).get(); ctx.setCustomStatus(customStatus); }) .buildAndStart(); @@ -468,7 +465,36 @@ void setCustomStatus() { metadata = client.waitForInstanceCompletion(instanceId, defaultTimeout, true); assertNotNull(metadata); assertEquals(OrchestrationRuntimeStatus.COMPLETED, metadata.getRuntimeStatus()); - assertEquals(payload, metadata.readCustomStatusAs(payload.getClass())); + assertEquals(payload, metadata.readCustomStatusAs(HashMap.class)); + } + } + + @Test + void clearCustomStatus() { + final String orchestratorName = "ClearCustomStatus"; + + DurableTaskGrpcWorker worker = this.createWorkerBuilder() + .addOrchestrator(orchestratorName, ctx -> { + ctx.setCustomStatus("Started!"); + ctx.waitForExternalEvent("StatusEvent").get(); + ctx.clearCustomStatus(); + }) + .buildAndStart(); + + DurableTaskClient client = DurableTaskGrpcClient.newBuilder().build(); + try (worker; client) { + String instanceId = client.scheduleNewOrchestrationInstance(orchestratorName); + + OrchestrationMetadata metadata = client.waitForInstanceStart(instanceId, defaultTimeout, true); + assertNotNull(metadata); + assertEquals("Started!", metadata.readCustomStatusAs(String.class)); + + client.raiseEvent(metadata.getInstanceId(), "StatusEvent"); + + metadata = client.waitForInstanceCompletion(instanceId, defaultTimeout, true); + assertNotNull(metadata); + assertEquals(OrchestrationRuntimeStatus.COMPLETED, metadata.getRuntimeStatus()); + assertEquals("", metadata.readCustomStatusAs(String.class)); } } } From 07e28d30f80a0874329aa9d27276ed3c22289521 Mon Sep 17 00:00:00 2001 From: Shreyas Gopalakrishna Date: Fri, 8 Apr 2022 13:36:20 -0500 Subject: [PATCH 4/5] Updated TaskOrchestratorResult to be immutable and hasCustomStatus in OrchestrationMetadata --- .../durabletask/OrchestrationMetadata.java | 4 ++++ .../TaskOrchestrationExecutor.java | 2 +- .../durabletask/TaskOrchestratorResult.java | 21 +++++++------------ .../durabletask/IntegrationTests.java | 4 ++-- 4 files changed, 14 insertions(+), 17 deletions(-) diff --git a/sdk/src/main/java/com/microsoft/durabletask/OrchestrationMetadata.java b/sdk/src/main/java/com/microsoft/durabletask/OrchestrationMetadata.java index 2c6e0dba..28956204 100644 --- a/sdk/src/main/java/com/microsoft/durabletask/OrchestrationMetadata.java +++ b/sdk/src/main/java/com/microsoft/durabletask/OrchestrationMetadata.java @@ -95,6 +95,10 @@ public T readCustomStatusAs(Class type) { return this.readPayloadAs(type, this.serializedCustomStatus); } + public boolean hasCustomStatus(Object object, Class type){ + return object.equals(this.readCustomStatusAs(type)); + } + private T readPayloadAs(Class type, String payload) { if (!this.requestedInputsAndOutputs) { throw new IllegalStateException("This method can only be used when instance metadata is fetched with the option to include input and output data."); diff --git a/sdk/src/main/java/com/microsoft/durabletask/TaskOrchestrationExecutor.java b/sdk/src/main/java/com/microsoft/durabletask/TaskOrchestrationExecutor.java index 65a6df2d..4a769b01 100644 --- a/sdk/src/main/java/com/microsoft/durabletask/TaskOrchestrationExecutor.java +++ b/sdk/src/main/java/com/microsoft/durabletask/TaskOrchestrationExecutor.java @@ -147,7 +147,7 @@ public void setCustomStatus(Object customStatus) { @Override public void clearCustomStatus() { - setCustomStatus(EMPTY_STRING); + this.setCustomStatus(EMPTY_STRING); } @Override diff --git a/sdk/src/main/java/com/microsoft/durabletask/TaskOrchestratorResult.java b/sdk/src/main/java/com/microsoft/durabletask/TaskOrchestratorResult.java index 32087f32..63fc3cb4 100644 --- a/sdk/src/main/java/com/microsoft/durabletask/TaskOrchestratorResult.java +++ b/sdk/src/main/java/com/microsoft/durabletask/TaskOrchestratorResult.java @@ -1,33 +1,26 @@ package com.microsoft.durabletask; +import com.google.common.collect.ImmutableList; import com.microsoft.durabletask.protobuf.OrchestratorService; import java.util.Collection; -public class TaskOrchestratorResult { +public final class TaskOrchestratorResult { - private Collection actions; + private final ImmutableList actions; - private String customStatus; + private final String customStatus; public TaskOrchestratorResult(Collection actions, String customStatus) { - this.actions = actions; + this.actions = ImmutableList.builder().addAll(actions).build(); this.customStatus = customStatus; } public Collection getActions() { - return actions; - } - - public void setActions(Collection actions) { - this.actions = actions; + return this.actions; } public String getCustomStatus() { - return customStatus; - } - - public void setCustomStatus(String customStatus) { - this.customStatus = customStatus; + return this.customStatus; } } diff --git a/sdk/src/test/java/com/microsoft/durabletask/IntegrationTests.java b/sdk/src/test/java/com/microsoft/durabletask/IntegrationTests.java index e535f068..7b38e771 100644 --- a/sdk/src/test/java/com/microsoft/durabletask/IntegrationTests.java +++ b/sdk/src/test/java/com/microsoft/durabletask/IntegrationTests.java @@ -465,7 +465,7 @@ void setCustomStatus() { metadata = client.waitForInstanceCompletion(instanceId, defaultTimeout, true); assertNotNull(metadata); assertEquals(OrchestrationRuntimeStatus.COMPLETED, metadata.getRuntimeStatus()); - assertEquals(payload, metadata.readCustomStatusAs(HashMap.class)); + assertTrue(metadata.hasCustomStatus(payload, HashMap.class)); } } @@ -494,7 +494,7 @@ void clearCustomStatus() { metadata = client.waitForInstanceCompletion(instanceId, defaultTimeout, true); assertNotNull(metadata); assertEquals(OrchestrationRuntimeStatus.COMPLETED, metadata.getRuntimeStatus()); - assertEquals("", metadata.readCustomStatusAs(String.class)); + assertTrue(metadata.hasCustomStatus("", String.class)); } } } From 27f01f8ef813b496fe65d6c1e43d19ffdc47be21 Mon Sep 17 00:00:00 2001 From: Shreyas Gopalakrishna Date: Fri, 8 Apr 2022 16:40:30 -0500 Subject: [PATCH 5/5] Updated hasCustomStatus in OrchestrationMetadata --- .../com/microsoft/durabletask/OrchestrationMetadata.java | 4 ++-- .../microsoft/durabletask/TaskOrchestrationExecutor.java | 2 +- .../com/microsoft/durabletask/TaskOrchestratorResult.java | 6 +++--- .../java/com/microsoft/durabletask/IntegrationTests.java | 5 +++-- 4 files changed, 9 insertions(+), 8 deletions(-) diff --git a/sdk/src/main/java/com/microsoft/durabletask/OrchestrationMetadata.java b/sdk/src/main/java/com/microsoft/durabletask/OrchestrationMetadata.java index 28956204..3265600d 100644 --- a/sdk/src/main/java/com/microsoft/durabletask/OrchestrationMetadata.java +++ b/sdk/src/main/java/com/microsoft/durabletask/OrchestrationMetadata.java @@ -95,8 +95,8 @@ public T readCustomStatusAs(Class type) { return this.readPayloadAs(type, this.serializedCustomStatus); } - public boolean hasCustomStatus(Object object, Class type){ - return object.equals(this.readCustomStatusAs(type)); + public boolean hasCustomStatus() { + return this.serializedCustomStatus != null && !this.serializedCustomStatus.isEmpty(); } private T readPayloadAs(Class type, String payload) { diff --git a/sdk/src/main/java/com/microsoft/durabletask/TaskOrchestrationExecutor.java b/sdk/src/main/java/com/microsoft/durabletask/TaskOrchestrationExecutor.java index 4a769b01..7141c51f 100644 --- a/sdk/src/main/java/com/microsoft/durabletask/TaskOrchestrationExecutor.java +++ b/sdk/src/main/java/com/microsoft/durabletask/TaskOrchestrationExecutor.java @@ -147,7 +147,7 @@ public void setCustomStatus(Object customStatus) { @Override public void clearCustomStatus() { - this.setCustomStatus(EMPTY_STRING); + this.setCustomStatus(null); } @Override diff --git a/sdk/src/main/java/com/microsoft/durabletask/TaskOrchestratorResult.java b/sdk/src/main/java/com/microsoft/durabletask/TaskOrchestratorResult.java index 63fc3cb4..2d0794c1 100644 --- a/sdk/src/main/java/com/microsoft/durabletask/TaskOrchestratorResult.java +++ b/sdk/src/main/java/com/microsoft/durabletask/TaskOrchestratorResult.java @@ -1,18 +1,18 @@ package com.microsoft.durabletask; -import com.google.common.collect.ImmutableList; import com.microsoft.durabletask.protobuf.OrchestratorService; import java.util.Collection; +import java.util.Collections; public final class TaskOrchestratorResult { - private final ImmutableList actions; + private final Collection actions; private final String customStatus; public TaskOrchestratorResult(Collection actions, String customStatus) { - this.actions = ImmutableList.builder().addAll(actions).build(); + this.actions = Collections.unmodifiableCollection(actions);; this.customStatus = customStatus; } diff --git a/sdk/src/test/java/com/microsoft/durabletask/IntegrationTests.java b/sdk/src/test/java/com/microsoft/durabletask/IntegrationTests.java index 7b38e771..c944c29e 100644 --- a/sdk/src/test/java/com/microsoft/durabletask/IntegrationTests.java +++ b/sdk/src/test/java/com/microsoft/durabletask/IntegrationTests.java @@ -465,7 +465,8 @@ void setCustomStatus() { metadata = client.waitForInstanceCompletion(instanceId, defaultTimeout, true); assertNotNull(metadata); assertEquals(OrchestrationRuntimeStatus.COMPLETED, metadata.getRuntimeStatus()); - assertTrue(metadata.hasCustomStatus(payload, HashMap.class)); + assertTrue(metadata.hasCustomStatus()); + assertEquals(payload, metadata.readCustomStatusAs(HashMap.class)); } } @@ -494,7 +495,7 @@ void clearCustomStatus() { metadata = client.waitForInstanceCompletion(instanceId, defaultTimeout, true); assertNotNull(metadata); assertEquals(OrchestrationRuntimeStatus.COMPLETED, metadata.getRuntimeStatus()); - assertTrue(metadata.hasCustomStatus("", String.class)); + assertFalse(metadata.hasCustomStatus()); } } }