如果资源路径包含namesapce,那么把namespace去掉
public static String wrapNamespace(String namespace, String resourceWithOutNamespace) {
当然也有反向的,除了去掉resource中的namespace外,还有给resource包上namespace
if (isRetryTopic(resourceWithOutNamespace)) {
stringBuilder.append(MixAll.RETRY_GROUP_TOPIC_PREFIX);
}
if (isDLQTopic(resourceWithOutNamespace)) {
stringBuilder.append(MixAll.DLQ_GROUP_TOPIC_PREFIX);
}
return stringBuilder.append(namespace).append(NAMESPACE_SEPARATOR).append(resourceWithoutRetryAndDLQ).toString();
基本是一样的,这里也可以看出来,Topic分RetryTopic,DLQTopic两大类
且namespace是以 % 做分割的
public static final String RETRY_GROUP_TOPIC_PREFIX = "%RETRY%";
public static final String DLQ_GROUP_TOPIC_PREFIX = "%DLQ%";
从MixAll工具类里,这一点也得到应征。
还有RetryTopic DLQTopic的判断方式:
public static boolean isRetryTopic(String resource) {
return StringUtils.isNotBlank(resource) && resource.startsWith(MixAll.RETRY_GROUP_TOPIC_PREFIX);
}
public static boolean isDLQTopic(String resource) {
return StringUtils.isNotBlank(resource) && resource.startsWith(MixAll.DLQ_GROUP_TOPIC_PREFIX);
}
也就是该resource资源路径是
以RetryTopic 或者DLQTopic
开头的。
总结下namesapceutil
org.apache.rocketmq.common.protocol.NamespaceUtil
这个工具类,
它围绕namespace
提供了很多拼接,以及拆分的方法
比如把 资源路径中的 namespace 去掉
或者给 资源路径 包上namespace
回到ClientConfig类
public Set<String> withNamespace(Set<String> resourceSet) {
Set<String> resourceWithNamespace = new HashSet<String>();
for (String resource : resourceSet) {
resourceWithNamespace.add(withNamespace(resource));
}
return resourceWithNamespace;
}
public String withoutNamespace(String resource) {
return NamespaceUtil.withoutNamespace(resource, this.getNamespace());
}
public Set<String> withoutNamespace(Set<String> resourceSet) {
Set<String> resourceWithoutNamespace = new HashSet<String>();
for (String resource : resourceSet) {
resourceWithoutNamespace.add(withoutNamespace(resource));
}
return resourceWithoutNamespace;
}