From d2b863961ea6e903ec7246b2d7ab6f81f70426d2 Mon Sep 17 00:00:00 2001 From: admin Date: Thu, 16 Jul 2026 12:59:15 +0200 Subject: [PATCH] add asyncComplete support to sdk Task base class asyncComplete was present on WorkflowTask but not exposed through the sdk, making it impossible to create async http or event tasks without subclassing as a workaround. adds the field to Task alongside optional and startDelay, wires it through toWorkflowTask() and restores it from the WorkflowTask constructor. any task type can now call .asyncComplete(true). Signed-off-by: klouds27 --- .../conductor/sdk/workflow/def/tasks/Task.java | 13 +++++++++++++ .../sdk/workflow/def/TaskConversionsTests.java | 13 +++++++++++++ 2 files changed, 26 insertions(+) diff --git a/conductor-client/src/main/java/com/netflix/conductor/sdk/workflow/def/tasks/Task.java b/conductor-client/src/main/java/com/netflix/conductor/sdk/workflow/def/tasks/Task.java index e814c192d..5d5263905 100644 --- a/conductor-client/src/main/java/com/netflix/conductor/sdk/workflow/def/tasks/Task.java +++ b/conductor-client/src/main/java/com/netflix/conductor/sdk/workflow/def/tasks/Task.java @@ -39,6 +39,8 @@ public abstract class Task { private int startDelay; + private boolean asyncComplete; + private final TaskType type; private Map input = new HashMap<>(); @@ -69,6 +71,7 @@ protected Task(WorkflowTask workflowTask) { this.input = workflowTask.getInputParameters(); this.description = workflowTask.getDescription(); this.name = workflowTask.getName(); + this.asyncComplete = Boolean.TRUE.equals(workflowTask.isAsyncComplete()); } public T name(String name) { @@ -81,6 +84,15 @@ public T description(String description) { return (T) this; } + public T asyncComplete(boolean asyncComplete) { + this.asyncComplete = asyncComplete; + return (T) this; + } + + public boolean isAsyncComplete() { + return asyncComplete; + } + public T input(String key, boolean value) { input.put(key, value); return (T) this; @@ -210,6 +222,7 @@ protected final WorkflowTask toWorkflowTask() { workflowTask.setInputParameters(input); workflowTask.setStartDelay(startDelay); workflowTask.setOptional(optional); + workflowTask.setAsyncComplete(asyncComplete); // Let the sub-classes enrich the workflow task before returning back updateWorkflowTask(workflowTask); diff --git a/conductor-client/src/test/java/com/netflix/conductor/sdk/workflow/def/TaskConversionsTests.java b/conductor-client/src/test/java/com/netflix/conductor/sdk/workflow/def/TaskConversionsTests.java index e0d044729..0f2f74247 100644 --- a/conductor-client/src/test/java/com/netflix/conductor/sdk/workflow/def/TaskConversionsTests.java +++ b/conductor-client/src/test/java/com/netflix/conductor/sdk/workflow/def/TaskConversionsTests.java @@ -460,6 +460,19 @@ public void testHttpConverter() { System.out.println(taskFromWorkflowTask.getInput()); } + @Test + public void testHttpAsyncComplete() { + Http httpTask = new Http("http_ref"); + httpTask.asyncComplete(true); + + WorkflowTask workflowTask = httpTask.getWorkflowDefTasks().get(0); + assertTrue(workflowTask.isAsyncComplete()); + + Task fromWorkflowTask = TaskRegistry.getTask(workflowTask); + assertTrue(fromWorkflowTask instanceof Http); + assertTrue(((Http) fromWorkflowTask).isAsyncComplete()); + } + @Test public void testJQTaskConversion() { JQ jqTask = new JQ("task_name", "{ key3: (.key1.value1 + .key2.value2) }");