{"record":{"id":"dd6f638b4039b807","repo":"paascloud/paascloud-master","slug":"tpc100500013","errorCode":"TPC100500013","errorMessage":"TPC100500013","messagePattern":"TPC100500013","errorType":"error_code","errorClass":"TpcBizException","httpStatus":null,"severity":"error","filePath":"paascloud-provider/paascloud-provider-tpc/src/main/java/com/paascloud/provider/mq/RocketMqProducer.java","lineNumber":43,"sourceCode":"\n/**\n * The class Rocket mq producer.\n *\n * @author paascloud.net @gmail.com\n */\n@Slf4j\n@NoArgsConstructor(access = AccessLevel.PRIVATE)\npublic class RocketMqProducer {\n\n\tprivate static final int PRODUCER_RETRY_TIMES = 3;\n\n\tpublic static SendResult sendSimpleMessage(String body, String topic, String tag, String key, String pid, Integer delayLevel) {\n\t\tif (delayLevel == null) {\n\t\t\tdelayLevel = 0;\n\t\t}\n\t\tMessage message = MqMessage.checkMessage(body, topic, tag, key);\n\t\tif (delayLevel < 0 || delayLevel > GlobalConstant.Number.EIGHTEEN_INT) {\n\t\t\tthrow new TpcBizException(ErrorCodeEnum.TPC100500013, topic, key);\n\t\t}\n\t\tmessage.setDelayTimeLevel(delayLevel);\n\t\treturn retrySendMessage(pid, message);\n\t}\n\n\tprivate static SendResult retrySendMessage(String pid, Message msg) {\n\t\tint iniCount = 1;\n\t\tSendResult result;\n\t\twhile (true) {\n\t\t\ttry {\n\t\t\t\tresult = MqProducerBeanFactory.getBean(pid).send(msg);\n\t\t\t\tbreak;\n\t\t\t} catch (Exception e) {\n\t\t\t\tlog.error(\"发送消息失败:\", e);\n\t\t\t\tif (iniCount++ >= PRODUCER_RETRY_TIMES) {\n\t\t\t\t\tthrow new TpcBizException(ErrorCodeEnum.TPC100500014, msg.getTopic(), msg.getKeys());\n\t\t\t\t}\n\t\t\t}","sourceCodeStart":25,"sourceCodeEnd":61,"githubUrl":"https://github.com/paascloud/paascloud-master/blob/781281a9503332ed3cef44ea618349d14230a127/paascloud-provider/paascloud-provider-tpc/src/main/java/com/paascloud/provider/mq/RocketMqProducer.java#L25-L61","documentation":"TPC100500013 (\"延迟级别错误, Topic=%s, MessageKey=%s\") is thrown by RocketMqProducer.sendSimpleMessage when the supplied delayLevel is outside the valid RocketMQ range 0–18 (RocketMQ supports delay levels 1..18, 0 meaning no delay). The message is rejected before being handed to the producer.","triggerScenarios":"Calling RocketMqProducer.sendSimpleMessage(body, topic, tag, key, pid, delayLevel) with a negative delayLevel or one greater than 18 (e.g. passing seconds/minutes instead of a level index, or a level from a different MQ's scheme).","commonSituations":"Mapping a business delay (e.g. 30 minutes) incorrectly to a level; RocketMQ level tables differing from RabbitMQ/ActiveMQ delay conventions; user input feeding delayLevel directly without clamping.","solutions":["Clamp or map your desired delay to a valid RocketMQ delay level 0–18 before calling sendSimpleMessage.","Check the RocketMQ delay-level table (1s, 5s, 10s, 30s, 1m, ... 2h) and pick the closest level.","If a larger delay is needed, use RocketMQ scheduled/timer message support or persist and poll instead of an invalid level.","Validate delayLevel at the API boundary and return a 400-style error instead of relying on the producer throw.","null is acceptable (treated as 0/no delay); avoid passing other sentinel values."],"exampleFix":"// before: passing delay in seconds\nRocketMqProducer.sendSimpleMessage(body, topic, tag, key, pid, 1800); // throws\n// after: map to a valid level (0-18)\nint delayLevel = mapToRocketMqLevel(Duration.ofMinutes(30)); // e.g. level 16\nRocketMqProducer.sendSimpleMessage(body, topic, tag, key, pid, delayLevel);","handlingStrategy":"validation","validationCode":"public static void checkDelayLevel(Integer delayLevel) {\n    int lvl = delayLevel == null ? 0 : delayLevel;\n    if (lvl < 0 || lvl > 18) {\n        throw new IllegalArgumentException(\"delayLevel must be 0-18, got \" + lvl);\n    }\n}","typeGuard":"boolean isValidDelayLevel(Integer l) { return l == null || (l >= 0 && l <= 18); }","tryCatchPattern":"try {\n    RocketMqProducer.sendSimpleMessage(body, topic, tag, key, pid, delayLevel);\n} catch (TpcBizException e) {\n    if (e.getCode() == 10050013) {\n        log.error(\"Invalid delayLevel {} for topic {}\", delayLevel, topic);\n        throw new BadRequestException(\"delayLevel out of range 0-18\");\n    }\n    throw e;\n}","preventionTips":["Map business durations to RocketMQ's level table (1s..2h) in one utility.","Clamp user-supplied delay values to 0–18 at the API boundary.","Never reuse delay constants from other MQ systems.","Document that null means no delay.","Add tests covering boundary levels 0, 1, 18, 19."],"tags":["rocketmq","validation","delay"],"backgroundTag":"value-out-of-range","analyzedSha":"781281a9503332ed3cef44ea618349d14230a127","analyzedAt":"2026-09-10T10:59:02.070Z","contentChangedAt":"2026-09-10T10:59:02.070Z","schemaVersion":2},"datasetVersion":"2026-09-16T04:17:20.429Z"}