From afc5c289f68eca8f3efcb20fa83931eb13ba7b65 Mon Sep 17 00:00:00 2001 From: Maciej Dudkowski Date: Thu, 10 Sep 2026 14:37:36 -0400 Subject: [PATCH 1/2] Use ActivitySerializationContext when starting and getting result of Standalone Activity --- .../client/RootActivityClientInvoker.java | 20 +++++++++++++++-- .../context/ActivitySerializationContext.java | 22 ++++++++++--------- 2 files changed, 30 insertions(+), 12 deletions(-) diff --git a/temporal-sdk/src/main/java/io/temporal/internal/client/RootActivityClientInvoker.java b/temporal-sdk/src/main/java/io/temporal/internal/client/RootActivityClientInvoker.java index 077ad34246..220c7ee625 100644 --- a/temporal-sdk/src/main/java/io/temporal/internal/client/RootActivityClientInvoker.java +++ b/temporal-sdk/src/main/java/io/temporal/internal/client/RootActivityClientInvoker.java @@ -32,6 +32,7 @@ import io.temporal.internal.nexus.CurrentNexusOperationContext; import io.temporal.internal.nexus.InternalNexusOperationContext; import io.temporal.internal.nexus.NexusOperationMetadata; +import io.temporal.payload.context.ActivitySerializationContext; import io.temporal.serviceclient.StatusUtils; import java.lang.reflect.Type; import java.util.*; @@ -63,7 +64,18 @@ public StartActivityOutput startActivity(StartActivityInput input) { if (Strings.isNullOrEmpty(options.getTaskQueue())) { throw new IllegalArgumentException("taskQueue must not be null or empty"); } - DataConverter dc = clientOptions.getDataConverter(); + DataConverter dc = + clientOptions + .getDataConverter() + .withContext( + new ActivitySerializationContext( + clientOptions.getNamespace(), + null, + null, + input.getActivityType(), + options.getTaskQueue(), + false)); + InternalNexusOperationContext nexusContext = CurrentNexusOperationContext.isNexusContext() ? CurrentNexusOperationContext.get() : null; NexusOperationMetadata nexusOperationMetadata = @@ -185,7 +197,11 @@ public StartActivityOutput startActivity(StartActivityInput input) { public GetActivityResultOutput getActivityResult(GetActivityResultInput input) throws TimeoutException { String namespace = clientOptions.getNamespace(); - DataConverter dc = clientOptions.getDataConverter(); + DataConverter dc = + clientOptions + .getDataConverter() + .withContext( + new ActivitySerializationContext(namespace, null, null, null, null, false)); Deadline deadline = Deadline.after(input.getTimeout(), input.getTimeoutUnit()); while (true) { diff --git a/temporal-sdk/src/main/java/io/temporal/payload/context/ActivitySerializationContext.java b/temporal-sdk/src/main/java/io/temporal/payload/context/ActivitySerializationContext.java index 57dcfb3138..d96be81b3f 100644 --- a/temporal-sdk/src/main/java/io/temporal/payload/context/ActivitySerializationContext.java +++ b/temporal-sdk/src/main/java/io/temporal/payload/context/ActivitySerializationContext.java @@ -11,26 +11,28 @@ public class ActivitySerializationContext implements HasWorkflowSerializationCon private final @Nonnull String namespace; private final @Nullable String workflowId; private final @Nullable String workflowType; - private final @Nonnull String activityType; - private final @Nonnull String activityTaskQueue; + private final @Nullable String activityType; + private final @Nullable String activityTaskQueue; private final boolean local; /** * @param namespace the activity's namespace; must not be {@code null} * @param workflowId the workflow ID that scheduled the activity, or {@code null} for standalone - * activities (stored as an empty string) + * activities * @param workflowType the workflow type that scheduled the activity, or {@code null} for - * standalone activities (stored as an empty string) - * @param activityType the activity type name; must not be {@code null} - * @param activityTaskQueue the task queue for this activity; must not be {@code null} + * standalone activities + * @param activityType the activity type name, or {@code null} if unknown. Activity type is + * unknown when getting a Standalone Activity result. + * @param activityTaskQueue the task queue for this activity, or {@code null} if unknown. Task + * queue is unknown when getting a Standalone Activity result. * @param local {@code true} if this is a local activity */ public ActivitySerializationContext( @Nonnull String namespace, @Nullable String workflowId, @Nullable String workflowType, - @Nonnull String activityType, - @Nonnull String activityTaskQueue, + @Nullable String activityType, + @Nullable String activityTaskQueue, boolean local) { this.namespace = Objects.requireNonNull(namespace); this.workflowId = workflowId; @@ -67,12 +69,12 @@ public String getWorkflowType() { return workflowType; } - @Nonnull + @Nullable public String getActivityType() { return activityType; } - @Nonnull + @Nullable public String getActivityTaskQueue() { return activityTaskQueue; } From edc23797b2eb1de1ef09e95ec145e691bcb4c052 Mon Sep 17 00:00:00 2001 From: Maciej Dudkowski Date: Thu, 10 Sep 2026 15:21:57 -0400 Subject: [PATCH 2/2] Fixed NPE --- .../payload/context/ActivitySerializationContext.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/temporal-sdk/src/main/java/io/temporal/payload/context/ActivitySerializationContext.java b/temporal-sdk/src/main/java/io/temporal/payload/context/ActivitySerializationContext.java index d96be81b3f..78ba63d247 100644 --- a/temporal-sdk/src/main/java/io/temporal/payload/context/ActivitySerializationContext.java +++ b/temporal-sdk/src/main/java/io/temporal/payload/context/ActivitySerializationContext.java @@ -37,8 +37,8 @@ public ActivitySerializationContext( this.namespace = Objects.requireNonNull(namespace); this.workflowId = workflowId; this.workflowType = workflowType; - this.activityType = Objects.requireNonNull(activityType); - this.activityTaskQueue = Objects.requireNonNull(activityTaskQueue); + this.activityType = activityType; + this.activityTaskQueue = activityTaskQueue; this.local = local; }