apache/pulsar · error · IllegalArgumentException

The shared resource doesn't support thread pool configurati

Error message

The shared resource  doesn't support thread pool configuration

What it means

PulsarClientSharedResourcesBuilder.configureThreadPool() only accepts the ThreadPool shared resource. If you pass any other SharedResource (e.g. IO or Memory), the builder throws this IllegalArgumentException because thread-pool sizing semantics do not apply to those resource types.

Source

Thrown at pulsar-client/src/main/java/org/apache/pulsar/client/impl/PulsarClientSharedResourcesBuilderImpl.java:291

                case ThreadPool:
                    return new ThreadPoolResourceConfig();
                case Timer:
                    return new TimerResourceConfig();
                case MemoryLimitController:
                    return new MemoryLimitResourceConfig();
                case OpenTelemetry:
                    return new OpenTelemetryResourceConfig();
                default:
                    throw new IllegalArgumentException("Unknown resource type: " + sharedResource.getType());
            }
        });
    }

    @Override
    public PulsarClientSharedResourcesBuilder configureThreadPool(
            PulsarClientSharedResources.SharedResource sharedResource, Consumer<ThreadPoolConfig<?>> configurer) {
        if (sharedResource.getType() != PulsarClientSharedResources.SharedResourceType.ThreadPool) {
            throw new IllegalArgumentException("The shared resource " + sharedResource + " doesn't support thread pool"
                    + " configuration");
        }
        configurer.accept(getOrCreateConfig(sharedResource));
        return this;
    }

    @Override
    public PulsarClientSharedResourcesBuilder configureEventLoop(Consumer<EventLoopGroupConfig> configurer) {
        configurer.accept(getOrCreateConfig(PulsarClientSharedResources.SharedResource.EventLoopGroup));
        return this;
    }

    @Override
    public PulsarClientSharedResourcesBuilder configureDnsResolver(Consumer<DnsResolverConfig> configurer) {
        configurer.accept(getOrCreateConfig(PulsarClientSharedResources.SharedResource.DnsResolver));
        return this;
    }

View on GitHub (pinned to 820761864e)

Solutions

  1. Pass only PulsarClientSharedResources.SharedResource.ThreadPool to configureThreadPool
  2. Use the correct configure method for the resource type (e.g. the IO or memory-specific configurers)
  3. Check sharedResource.getType() before invoking configureThreadPool in generic configuration code

Example fix

// before
builder.configureThreadPool(PulsarClientSharedResources.SharedResource.IO, cfg -> cfg.setThreads(8));
// after
builder.configureThreadPool(PulsarClientSharedResources.SharedResource.ThreadPool, cfg -> cfg.setThreads(8));
Defensive patterns

Strategy: validation

Validate before calling

if (sharedResource.getType() == PulsarClientSharedResources.SharedResourceType.ThreadPool) {
    builder.configureThreadPool(sharedResource, cfg -> cfg.setThreads(8));
}

Type guard

boolean supportsThreadPoolConfig(PulsarClientSharedResources.SharedResource r) {
    return r.getType() == PulsarClientSharedResources.SharedResourceType.ThreadPool;
}

Try / catch

try {
    builder.configureThreadPool(sharedResource, cfg -> cfg.setThreads(8));
} catch (IllegalArgumentException e) {
    log.warn("Resource {} does not support thread pool config: {}", sharedResource, e.getMessage());
}

Prevention

When it happens

Trigger: Calling configureThreadPool(sharedResource, configurer) with a SharedResource whose type is not SharedResourceType.ThreadPool, e.g. PulsarClientSharedResources.SharedResource.IO.

Common situations: Configuring multiple shared client resources in a loop and applying the thread-pool configurer to every resource instead of only the ThreadPool one; copy-pasting a memory/IO configuration block and adding a pool configurer to it.

Related errors


AI-assisted analysis of apache/pulsar@820761864e (2026-09-06). Data as JSON: /api/errors/4466897007931ddf. Report an issue: GitHub.