From 741ec6edfb03999dbfaf1b40dc501d739f792111 Mon Sep 17 00:00:00 2001 From: Spencer Judge Date: Fri, 10 Apr 2026 08:20:32 -0700 Subject: [PATCH] Fix worker options default application overriding poller behavior --- .../io/temporal/worker/WorkerOptions.java | 10 +++++-- .../io/temporal/worker/WorkerOptionsTest.java | 29 +++++++++++++++++++ 2 files changed, 36 insertions(+), 3 deletions(-) diff --git a/temporal-sdk/src/main/java/io/temporal/worker/WorkerOptions.java b/temporal-sdk/src/main/java/io/temporal/worker/WorkerOptions.java index d71ed9af0..f8bfd2f44 100644 --- a/temporal-sdk/src/main/java/io/temporal/worker/WorkerOptions.java +++ b/temporal-sdk/src/main/java/io/temporal/worker/WorkerOptions.java @@ -646,13 +646,17 @@ public WorkerOptions validateAndBuildWithDefaults() { workerTuner, maxTaskQueueActivitiesPerSecond, maxConcurrentWorkflowTaskPollers == 0 - ? DEFAULT_MAX_CONCURRENT_WORKFLOW_TASK_POLLERS + ? (workflowTaskPollersBehavior != null + ? 0 + : DEFAULT_MAX_CONCURRENT_WORKFLOW_TASK_POLLERS) : maxConcurrentWorkflowTaskPollers, maxConcurrentActivityTaskPollers == 0 - ? DEFAULT_MAX_CONCURRENT_ACTIVITY_TASK_POLLERS + ? (activityTaskPollersBehavior != null + ? 0 + : DEFAULT_MAX_CONCURRENT_ACTIVITY_TASK_POLLERS) : maxConcurrentActivityTaskPollers, maxConcurrentNexusTaskPollers == 0 - ? DEFAULT_MAX_CONCURRENT_NEXUS_TASK_POLLERS + ? (nexusTaskPollersBehavior != null ? 0 : DEFAULT_MAX_CONCURRENT_NEXUS_TASK_POLLERS) : maxConcurrentNexusTaskPollers, localActivityWorkerOnly, defaultDeadlockDetectionTimeout == 0 diff --git a/temporal-sdk/src/test/java/io/temporal/worker/WorkerOptionsTest.java b/temporal-sdk/src/test/java/io/temporal/worker/WorkerOptionsTest.java index 10e9ebd2d..897600443 100644 --- a/temporal-sdk/src/test/java/io/temporal/worker/WorkerOptionsTest.java +++ b/temporal-sdk/src/test/java/io/temporal/worker/WorkerOptionsTest.java @@ -144,6 +144,35 @@ public void throwsIfResourceControllerIsNotSame() { nexusSlotSupplier)); } + @Test + public void validateAndBuildWithDefaultsDoesNotSetPollerDefaultsWhenBehaviorIsSet() { + WorkerOptions options = + WorkerOptions.newBuilder() + .setWorkflowTaskPollersBehavior(new PollerBehaviorAutoscaling()) + .setActivityTaskPollersBehavior(new PollerBehaviorAutoscaling()) + .setNexusTaskPollersBehavior(new PollerBehaviorAutoscaling()) + .validateAndBuildWithDefaults(); + + assertEquals(0, options.getMaxConcurrentWorkflowTaskPollers()); + assertEquals(0, options.getMaxConcurrentActivityTaskPollers()); + assertEquals(0, options.getMaxConcurrentNexusTaskPollers()); + assertNotNull(options.getWorkflowTaskPollersBehavior()); + assertNotNull(options.getActivityTaskPollersBehavior()); + assertNotNull(options.getNexusTaskPollersBehavior()); + } + + @Test + public void validateAndBuildWithDefaultsIsIdempotentWithPollerBehavior() { + WorkerOptions first = + WorkerOptions.newBuilder() + .setWorkflowTaskPollersBehavior(new PollerBehaviorAutoscaling()) + .validateAndBuildWithDefaults(); + WorkerOptions second = WorkerOptions.newBuilder(first).validateAndBuildWithDefaults(); + + assertEquals(0, second.getMaxConcurrentWorkflowTaskPollers()); + assertNotNull(second.getWorkflowTaskPollersBehavior()); + } + @Test public void verifyMaxTaskQueuePerSecondsDisablesEagerExecution() { // Verify that by default eager execution is enabled