diff --git a/common/src/main/java/org/apache/rocketmq/common/topic/TopicValidator.java b/common/src/main/java/org/apache/rocketmq/common/topic/TopicValidator.java index ade6289c67f..f1b59848c9e 100644 --- a/common/src/main/java/org/apache/rocketmq/common/topic/TopicValidator.java +++ b/common/src/main/java/org/apache/rocketmq/common/topic/TopicValidator.java @@ -48,6 +48,8 @@ public class TopicValidator { private static final int GROUP_MAX_LENGTH = 120; private static final int RETRY_OR_DLQ_TOPIC_MAX_LENGTH = 255; + private static volatile int groupMaxLength = GROUP_MAX_LENGTH; + private static final Set SYSTEM_TOPIC_SET = new HashSet<>(); /** @@ -139,6 +141,11 @@ public static ValidateResult validateTopic(String topic) { return new ValidateResult(true, ""); } + public static void setGroupMaxLength(int maxLength) { + groupMaxLength = maxLength <= 0 ? GROUP_MAX_LENGTH + : Math.min(maxLength, RETRY_OR_DLQ_TOPIC_MAX_LENGTH); + } + public static ValidateResult validateGroup(String group) { if (UtilAll.isBlank(group)) { @@ -150,8 +157,8 @@ public static ValidateResult validateGroup(String group) { return new ValidateResult(false, falseRemark); } - if (group.length() > GROUP_MAX_LENGTH) { - String falseRemark = "The specified group: " + group + ", is longer than group max length: " + GROUP_MAX_LENGTH; + if (group.length() > groupMaxLength) { + String falseRemark = "The specified group: " + group + ", is longer than group max length: " + groupMaxLength; return new ValidateResult(false, falseRemark); } diff --git a/common/src/test/java/org/apache/rocketmq/common/topic/TopicValidatorTest.java b/common/src/test/java/org/apache/rocketmq/common/topic/TopicValidatorTest.java index 0541c7f6d2e..879b9a5f718 100644 --- a/common/src/test/java/org/apache/rocketmq/common/topic/TopicValidatorTest.java +++ b/common/src/test/java/org/apache/rocketmq/common/topic/TopicValidatorTest.java @@ -87,6 +87,27 @@ public void testGroupValidator__NotPass() { assertThat(res.isValid()).isFalse(); } + @Test + public void testGroupValidator_WithCustomMaxLength() { + try { + TopicValidator.setGroupMaxLength(255); + assertThat(TopicValidator.validateGroup(generateString2(255)).isValid()).isTrue(); + assertThat(TopicValidator.validateGroup(generateString2(256)).isValid()).isFalse(); + + // values above 255 are capped at 255 + TopicValidator.setGroupMaxLength(300); + assertThat(TopicValidator.validateGroup(generateString2(255)).isValid()).isTrue(); + assertThat(TopicValidator.validateGroup(generateString2(256)).isValid()).isFalse(); + + // non-positive values fall back to the default of 120 + TopicValidator.setGroupMaxLength(0); + assertThat(TopicValidator.validateGroup(generateString2(120)).isValid()).isTrue(); + assertThat(TopicValidator.validateGroup(generateString2(121)).isValid()).isFalse(); + } finally { + TopicValidator.setGroupMaxLength(120); + } + } + @Test public void testAddSystemTopic() { String topic = "SYSTEM_TOPIC_TEST";