RocketMQ控制台手动新增主题,报错:clusterName or brokerName can not be all blank

本文介绍了解决RocketMQ-Dashboard中手动添加主题失败的问题。通过调整配置文件中的brokerIP1和namesrvAddr参数,并重启Broker服务,最终实现了控制台页面能够正确显示和新增主题。

第一次安装并使用RocketMQ-Dashboard

RocketMQ-Dashboard源码地址
编译之后,连接RocketMQ服务。
成功连接RocketMQ控制台

手动新增主题的时候,提示:clusterName or brokerName can not be all blank

java.lang.IllegalArgumentException: clusterName or brokerName can not be all blank
	at com.google.common.base.Preconditions.checkArgument(Preconditions.java:142)
	at org.apache.rocketmq.dashboard.controller.TopicController.topicCreateOrUpdateRequest(TopicController.java:75)
	at org.apache.rocketmq.dashboard.controller.TopicController$$FastClassBySpringCGLIB$$8429e433.invoke(<generated>)
	at org.springframework.cglib.proxy.MethodProxy.invoke(MethodProxy.java:218)
	at org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.invokeJoinpoint(CglibAopProxy.java:783)
	at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:163)
	at org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.proceed(CglibAopProxy.java:753)
	at org.springframework.aop.aspectj.MethodInvocationProceedingJoinPoint.proceed(MethodInvocationProceedingJoinPoint.java:89)
	at org.apache.rocketmq.dashboard.permisssion.PermissionAspect.checkPermission(PermissionAspect.java:67)
	at sun.reflect.GeneratedMethodAccessor61.invoke(Unknown Source)
	at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
	at java.lang.reflect.Method.invoke(Method.java:498)
	at org.springframework.aop.aspectj.AbstractAspectJAdvice.invokeAdviceMethodWithGivenArgs(AbstractAspectJAdvice.java:634)
	at org.springframework.aop.aspectj.AbstractAspectJAdvice.invokeAdviceMethod(AbstractAspectJAdvice.java:624)
	at org.springframework.aop.aspectj.AspectJAroundAdvice.invoke(AspectJAroundAdvice.java:72)
	at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:175)
	at org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.proceed(CglibAopProxy.java:753)
	at org.springframework.aop.interceptor.ExposeInvocationInterceptor.invoke(ExposeInvocationInterceptor.java:97)
	at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:186)
	at org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.proceed(CglibAopProxy.java:753)
	at org.springframework.aop.framework.CglibAopProxy$DynamicAdvisedInterceptor.intercept(CglibAopProxy.java:698)
	at org.apache.rocketmq.dashboard.controller.TopicController$$EnhancerBySpringCGLIB$$274a8f35.topicCreateOrUpdateRequest(<generated>)
	at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
	at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
	at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
	at java.lang.reflect.Method.invoke(Method.java:498)
	at org.springframework.web.method.support.InvocableHandlerMethod.doInvoke(InvocableHandlerMethod.java:205)
	at org.springframework.web.method.support.InvocableHandlerMethod.invokeForRequest(InvocableHandlerMethod.java:150)
	at org.springframework.web.servlet.mvc.method.annotation.ServletInvocableHandlerMethod.invokeAndHandle(ServletInvocableHandlerMethod.java:117)
	at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.invokeHandlerMethod(RequestMappingHandlerAdapter.java:895)
	at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.handleInternal(RequestMappingHandlerAdapter.java:808)
	at org.springframework.web.servlet.mvc.method.AbstractHandlerMethodAdapter.handle(AbstractHandlerMethodAdapter.java:87)
	at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:1067)
	at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:963)
	at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:1006)
	at org.springframework.web.servlet.FrameworkServlet.doPost(FrameworkServlet.java:909)
	at javax.servlet.http.HttpServlet.service(HttpServlet.java:681)
	at org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:883)
	at javax.servlet.http.HttpServlet.service(HttpServlet.java:764)
	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:227)
	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:162)
	at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:53)
	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:189)
	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:162)
	at org.apache.rocketmq.dashboard.filter.HttpBasicAuthorizedFilter.doFilter(HttpBasicAuthorizedFilter.java:45)
	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:189)
	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:162)
	at org.springframework.web.filter.RequestContextFilter.doFilterInternal(RequestContextFilter.java:100)
	at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:119)
	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:189)
	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:162)
	at org.springframework.web.filter.FormContentFilter.doFilterInternal(FormContentFilter.java:93)
	at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:119)
	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:189)
	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:162)
	at org.springframework.boot.actuate.metrics.web.servlet.WebMvcMetricsFilter.doFilterInternal(WebMvcMetricsFilter.java:96)
	at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:119)
	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:189)
	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:162)
	at org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(CharacterEncodingFilter.java:201)
	at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:119)
	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:189)
	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:162)
	at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:197)
	at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:97)
	at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:540)
	at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:135)
	at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:92)
	at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:78)
	at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:357)
	at org.apache.coyote.http11.Http11Processor.service(Http11Processor.java:382)
	at org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:65)
	at org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:895)
	at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1722)
	at org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:49)
	at org.apache.tomcat.util.threads.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1191)
	at org.apache.tomcat.util.threads.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:659)
	at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61)
	at java.lang.Thread.run(Thread.java:748) 

在服务器通过命令手动新增主题

sh bin/mqadmin updateTopic -n 127.0.0.1:9876 -b 127.0.0.1:10911 -t  topic-test 

新增主题成功

提示新增成功,但在控制台页面,查不到相关主题。通过命令

sh mqadmin topicList -n 192.168.2.11:9876

查不到通过命令新增的主题

通过查询博文参考资料发现问题:

修改${RocketMQ_HOME}/conf/broker.conf
新增brokerIP1和namesrvAddr

brokerClusterName = DefaultCluster
brokerName = broker-a
brokerId = 0
deleteWhen = 04
fileReservedTime = 48
brokerRole = ASYNC_MASTER
flushDiskType = ASYNC_FLUSH
/**--新增内容--**/
brokerIP1=192.168.2.11
namesrvAddr=192.168.2.11:9876

修改之后保存,重启broker
指定broker.conf文件地址:bin/mqbroker -c /rocketmq-all-4.6.0-bin-release/conf/broker.conf
刷新之后,主题能正确显示,并且可通过控制台页面手动新增主题
在这里插入图片描述

### Kafka Topic 未在元数据中找到的解决方案 当运行 Kafka 控制台时,如果遇到 `Topic XXX not present in metadata after 60000 ms` 的错误,这通常表明 Kafka 客户端无法在指定的时间内获取到目标主题的元数据。以下是可能的原因及解决方法: #### 1. 检查 Topic 是否已创建 确保目标 Topic 已正确创建。可以通过以下命令检查是否存在该 Topic: ```bash kafka-topics.sh --bootstrap-server <broker-host>:<port> --list ``` 如果目标 Topic 不存在,则需要使用以下命令创建它: ```bash kafka-topics.sh --bootstrap-server <broker-host>:<port> --create --topic <topic-name> --partitions <num-partitions> --replication-factor <replication-factor> ``` 此步骤可以验证是否是由于 Topic 缺失导致的问题[^1]。 #### 2. 验证 Broker 配置 确认 Kafka Broker 是否正常运行,并且客户端能够连接到正确的 Broker 地址。检查以下配置项: - `advertised.listeners`: 确保其值与客户端连接地址一致。 - `zookeeper.connect`: 如果使用的是较旧版本的 Kafka(未启用 KRaft),需要确保 Zookeeper 正常运行并配置正确。 如果 Broker 配置不正确,客户端可能无法获取 Topic 的元数据[^2]。 #### 3. 检查网络延迟或分区问题 如果 Broker 和 Topic 都配置正确,但仍出现超时问题,可能是由于网络延迟或分区问题导致。可以通过以下方式排查: - 使用 `ping` 或 `traceroute` 测试客户端与 Broker 之间的网络延迟。 - 检查 Kafka Broker 日志,寻找是否有分区不可用或副本同步失败的记录。 #### 4. 增加超时时间 如果网络环境较差或 Broker 负载较高,可以尝试增加客户端的超时时间。例如,在 Spring Kafka 中,可以通过以下配置调整超时时间: ```properties spring.kafka.producer.properties.request.timeout.ms=120000 spring.kafka.producer.properties.metadata.max.age.ms=120000 ``` 此设置允许客户端有更多时间等待元数据的响应[^1]。 #### 5. 检查 ACL 权限 如果 Kafka 集群启用了 ACL(访问控制列表),需要确保客户端具有足够的权限来访问目标 Topic。可以通过以下命令检查和设置权限: ```bash kafka-acls.sh --authorizer-properties zookeeper.connect=<zookeeper-host>:<port> --list --cluster kafka-acls.sh --authorizer-properties zookeeper.connect=<zookeeper-host>:<port> --add --allow-principal User:<username> --operation All --topic <topic-name> ``` #### 6. 检查 Debezium Connector 配置 如果问题出现在 Debezium 连接器中,需要确保连接器的配置正确无误。特别是以下参数: - `topics`: 确保目标 Topic 名称与实际创建的 Topic 匹配。 - `key.converter` 和 `value.converter`: 确保数据格式转换器配置正确。 重新提交 Debezium Connector 后,再次验证是否解决问题[^2]。 ### 示例代码:创建 Kafka Topic 以下是一个通过 Java API 创建 Kafka Topic 的示例: ```java import org.apache.kafka.clients.admin.AdminClient; import org.apache.kafka.clients.admin.NewTopic; import java.util.Collections; import java.util.Properties; public class KafkaTopicCreator { public static void main(String[] args) { Properties props = new Properties(); props.put("bootstrap.servers", "localhost:9092"); try (AdminClient adminClient = AdminClient.create(props)) { NewTopic topic = new NewTopic("test-topic", 3, (short) 1); adminClient.createTopics(Collections.singletonList(topic)).all().get(); System.out.println("Topic created successfully."); } catch (Exception e) { e.printStackTrace(); } } } ``` ---
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值