conductor-oss/conductor · critical · IllegalStateException

conductor.app.sweeper-thread-count must be greater than 0.

Error message

conductor.app.sweeper-thread-count must be greater than 0.

What it means

Thrown by the sweeperExecutor @Bean in SchedulerConfiguration during Spring context startup. The sweeper is the background pool that periodically re-evaluates in-flight workflows (the decider queue). The bean refuses to be created when conductor.app.sweeper-thread-count is zero or negative, because a zero-size fixed thread pool cannot run anything and would silently stall all workflow progress.

Source

Thrown at core/src/main/java/com/netflix/conductor/core/config/SchedulerConfiguration.java:59

     * @see com.netflix.conductor.core.events.queue.ConductorObservableQueue
     */
    @Bean
    public Scheduler scheduler(ConductorProperties properties) {
        ThreadFactory threadFactory =
                new BasicThreadFactory.Builder()
                        .namingPattern("event-queue-poll-scheduler-thread-%d")
                        .build();
        Executor executorService =
                Executors.newFixedThreadPool(
                        properties.getEventQueueSchedulerPollThreadCount(), threadFactory);

        return Schedulers.from(executorService);
    }

    @Bean(SWEEPER_EXECUTOR_NAME)
    public Executor sweeperExecutor(ConductorProperties properties) {
        if (properties.getSweeperThreadCount() <= 0) {
            throw new IllegalStateException(
                    "conductor.app.sweeper-thread-count must be greater than 0.");
        }
        ThreadFactory threadFactory =
                new BasicThreadFactory.Builder().namingPattern("sweeper-thread-%d").build();
        return Executors.newFixedThreadPool(properties.getSweeperThreadCount(), threadFactory);
    }

    @Override
    public void configureTasks(ScheduledTaskRegistrar taskRegistrar) {
        ThreadPoolTaskScheduler threadPoolTaskScheduler = new ThreadPoolTaskScheduler();
        threadPoolTaskScheduler.setPoolSize(3); // equal to the number of scheduled jobs
        threadPoolTaskScheduler.setThreadNamePrefix("scheduled-task-pool-");
        threadPoolTaskScheduler.initialize();
        taskRegistrar.setTaskScheduler(threadPoolTaskScheduler);
    }
}

View on GitHub (pinned to cf7c3e4a8a)

Solutions

  1. Set conductor.app.sweeper-thread-count to a positive integer (e.g. the default of availableProcessors()*2, or at minimum 1).
  2. If the intent was to disable sweeping entirely rather than resize it, find the proper sweeper-enabled property for your version instead of zeroing the thread count.
  3. Verify no env var or profile overrides the value to 0 (grep for sweeper-thread-count across all active property sources).

Example fix

// before
conductor.app.sweeper-thread-count=0
// after
conductor.app.sweeper-thread-count=8
Defensive patterns

Strategy: validation

Validate before calling

// Validate sweeper thread count before relying on the bean
int count = properties.getSweeperThreadCount();
if (count <= 0) {
    throw new IllegalStateException(
        "conductor.app.sweeper-thread-count must be > 0; was " + count);
}

Prevention

When it happens

Trigger: Setting the property conductor.app.sweeper-thread-count=0 (or a negative value) in application.properties / env, or passing it via -Dconductor.app.sweeper-thread-count=0. The guard is properties.getSweeperThreadCount() <= 0 inside the sweeperExecutor(ConductorProperties) bean method, which fires at bean wiring time before the app boots.

Common situations: Operator tries to disable the sweeper by setting the count to 0 (wrong approach). Migration from an older version where the property had a different key. An env-var override that resolves to an empty string is coerced to 0. Note the default is availableProcessors()*2, so this only fires when explicitly misconfigured.

Related errors


AI-assisted analysis of conductor-oss/conductor@cf7c3e4a8a (2026-08-14). Data as JSON: /api/errors/7265e09c314f91d3. Report an issue: GitHub.