{"record":{"id":"7493af0106648c1b","repo":"apache/rocketmq","slug":"consumethreadmin-min-is-larger-than-consumethr","errorCode":null,"errorMessage":"consumeThreadMin ({min}) is larger than consumeThreadMax ({max})","messagePattern":"consumeThreadMin \\((.+?)\\) is larger than consumeThreadMax \\((.+?)\\)","errorType":"validation","errorClass":"MQClientException","httpStatus":null,"severity":"error","filePath":"client/src/main/java/org/apache/rocketmq/client/impl/consumer/DefaultMQPushConsumerImpl.java","lineNumber":1118,"sourceCode":"        if (this.defaultMQPushConsumer.getConsumeThreadMin() < 1\n            || this.defaultMQPushConsumer.getConsumeThreadMin() > 1000) {\n            throw new MQClientException(\n                \"consumeThreadMin Out of range [1, 1000]\"\n                    + FAQUrl.suggestTodo(FAQUrl.CLIENT_PARAMETER_CHECK_URL),\n                null);\n        }\n\n        // consumeThreadMax\n        if (this.defaultMQPushConsumer.getConsumeThreadMax() < 1 || this.defaultMQPushConsumer.getConsumeThreadMax() > 1000) {\n            throw new MQClientException(\n                \"consumeThreadMax Out of range [1, 1000]\"\n                    + FAQUrl.suggestTodo(FAQUrl.CLIENT_PARAMETER_CHECK_URL),\n                null);\n        }\n\n        // consumeThreadMin can't be larger than consumeThreadMax\n        if (this.defaultMQPushConsumer.getConsumeThreadMin() > this.defaultMQPushConsumer.getConsumeThreadMax()) {\n            throw new MQClientException(\n                \"consumeThreadMin (\" + this.defaultMQPushConsumer.getConsumeThreadMin() + \") \"\n                    + \"is larger than consumeThreadMax (\" + this.defaultMQPushConsumer.getConsumeThreadMax() + \")\",\n                null);\n        }\n\n        // consumeConcurrentlyMaxSpan\n        if (this.defaultMQPushConsumer.getConsumeConcurrentlyMaxSpan() < 1\n            || this.defaultMQPushConsumer.getConsumeConcurrentlyMaxSpan() > 65535) {\n            throw new MQClientException(\n                \"consumeConcurrentlyMaxSpan Out of range [1, 65535]\"\n                    + FAQUrl.suggestTodo(FAQUrl.CLIENT_PARAMETER_CHECK_URL),\n                null);\n        }\n\n        // pullThresholdForQueue\n        if (this.defaultMQPushConsumer.getPullThresholdForQueue() < 1 || this.defaultMQPushConsumer.getPullThresholdForQueue() > 65535) {\n            throw new MQClientException(\n                \"pullThresholdForQueue Out of range [1, 65535]\"","sourceCodeStart":1100,"sourceCodeEnd":1136,"githubUrl":"https://github.com/apache/rocketmq/blob/293f5885719fc4aa3619446a1900f58ccfcfdd29/client/src/main/java/org/apache/rocketmq/client/impl/consumer/DefaultMQPushConsumerImpl.java#L1100-L1136","documentation":"checkConfig() enforces the invariant consumeThreadMin <= consumeThreadMax for the consumer's thread pool. Each bound individually passed the [1,1000] check, but min exceeds max, which would produce an invalid executor configuration.","triggerScenarios":"Setting min larger than max (e.g. min=64, max=20); updating only one of the two in config so previously-consistent values now cross; environment-specific overrides changing max but not min.","commonSituations":"Different files/environments setting the pair inconsistently; renaming config keys so one side falls back to default while the other keeps an old value.","solutions":["Make consumeThreadMin <= consumeThreadMax (commonly equal, e.g. both 20)","Define the pair once in a single config block (min, max together) so they cannot drift","Add a startup assertion in your consumer factory: Preconditions.checkArgument(min <= max)"],"exampleFix":"// before\nconsumer.setConsumeThreadMin(64);\nconsumer.setConsumeThreadMax(20); // min > max\n\n// after\nconsumer.setConsumeThreadMin(20);\nconsumer.setConsumeThreadMax(64);","handlingStrategy":"validation","validationCode":"if (config.getConsumeThreadMin() > config.getConsumeThreadMax())\n    throw new IllegalArgumentException(\"consumeThreadMin > consumeThreadMax\");\nconsumer.setConsumeThreadMin(config.getConsumeThreadMin());\nconsumer.setConsumeThreadMax(config.getConsumeThreadMax());","typeGuard":null,"tryCatchPattern":null,"preventionTips":["Define min/max thread settings in one config block so they cannot drift","Add a startup precondition min <= max in your consumer factory"],"tags":["rocketmq","config","thread-pool","invariant"],"backgroundTag":null,"analyzedSha":"293f5885719fc4aa3619446a1900f58ccfcfdd29","analyzedAt":"2026-08-14T11:50:13.822Z","schemaVersion":2},"datasetVersion":"2026-08-15T22:17:37.221Z"}