apache/rocketmq · error · MQClientException

consumeThreadMin Out of range [1, 1000]

Error message

consumeThreadMin Out of range [1, 1000]

What it means

checkConfig() validates the consume-thread pool's minimum thread count: it must be between 1 and 1000 inclusive. consumeThreadMin defaults to 20, so this fires only when the value was explicitly changed to 0, a negative number, or something above 1000.

Source

Thrown at client/src/main/java/org/apache/rocketmq/client/impl/consumer/DefaultMQPushConsumerImpl.java:1102

            throw new MQClientException(
                "messageListener is null"
                    + FAQUrl.suggestTodo(FAQUrl.CLIENT_PARAMETER_CHECK_URL),
                null);
        }

        boolean orderly = this.defaultMQPushConsumer.getMessageListener() instanceof MessageListenerOrderly;
        boolean concurrently = this.defaultMQPushConsumer.getMessageListener() instanceof MessageListenerConcurrently;
        if (!orderly && !concurrently) {
            throw new MQClientException(
                "messageListener must be instanceof MessageListenerOrderly or MessageListenerConcurrently"
                    + FAQUrl.suggestTodo(FAQUrl.CLIENT_PARAMETER_CHECK_URL),
                null);
        }

        // consumeThreadMin
        if (this.defaultMQPushConsumer.getConsumeThreadMin() < 1
            || this.defaultMQPushConsumer.getConsumeThreadMin() > 1000) {
            throw new MQClientException(
                "consumeThreadMin Out of range [1, 1000]"
                    + FAQUrl.suggestTodo(FAQUrl.CLIENT_PARAMETER_CHECK_URL),
                null);
        }

        // consumeThreadMax
        if (this.defaultMQPushConsumer.getConsumeThreadMax() < 1 || this.defaultMQPushConsumer.getConsumeThreadMax() > 1000) {
            throw new MQClientException(
                "consumeThreadMax Out of range [1, 1000]"
                    + FAQUrl.suggestTodo(FAQUrl.CLIENT_PARAMETER_CHECK_URL),
                null);
        }

        // consumeThreadMin can't be larger than consumeThreadMax
        if (this.defaultMQPushConsumer.getConsumeThreadMin() > this.defaultMQPushConsumer.getConsumeThreadMax()) {
            throw new MQClientException(
                "consumeThreadMin (" + this.defaultMQPushConsumer.getConsumeThreadMin() + ") "
                    + "is larger than consumeThreadMax (" + this.defaultMQPushConsumer.getConsumeThreadMax() + ")",

View on GitHub (pinned to 293f588571)

Solutions

  1. Set consumeThreadMin within [1,1000]; typical values 20 (default) or sized near CPU cores
  2. Fix the source config value; treat 0/-1 sentinels as errors at config-load time
  3. Also ensure consumeThreadMin <= consumeThreadMax or error 236 follows

Example fix

// before
consumer.setConsumeThreadMin(0); // invalid

// after
consumer.setConsumeThreadMin(20);
Defensive patterns

Strategy: validation

Validate before calling

int min = config.getConsumeThreadMin();
if (min < 1 || min > 1000) throw new IllegalArgumentException("consumeThreadMin must be in [1,1000]: " + min);
consumer.setConsumeThreadMin(min);

Type guard

boolean inThreadRange(int v) { return v >= 1 && v <= 1000; }

Prevention

When it happens

Trigger: setConsumeThreadMin(0) (often intended to 'use default'); values >1000 from misread config (e.g. copying a millis value into a thread count); property binding a missing key to 0.

Common situations: Config keys like consume-thread-min: 0 meaning 'auto' in the app's convention but invalid in RocketMQ; environment overrides that were never type-reviewed after a config-schema change.

Related errors


AI-assisted analysis of apache/rocketmq@293f588571 (2026-08-14). Data as JSON: /api/errors/282464ffae9df777. Report an issue: GitHub.