This is an automated email from the ASF dual-hosted git repository.

lizhimins pushed a commit to branch rocketmq-studio
in repository https://gitbox.apache.org/repos/asf/rocketmq-dashboard.git


The following commit(s) were added to refs/heads/rocketmq-studio by this push:
     new 4c130d26d fix(provider): tolerate null topic route queues (#2628)
4c130d26d is described below

commit 4c130d26d8e25a2db1b6d86cd91465c4fc0e9255
Author: btlqql <[email protected]>
AuthorDate: Wed Sep 2 17:02:06 2026 +0800

    fix(provider): tolerate null topic route queues (#2628)
---
 .../provider/apache/RocketMQAdminClientImpl.java   |  5 +++-
 .../apache/RocketMQAdminClientImplTest.java        | 31 ++++++++++++++++++++++
 2 files changed, 35 insertions(+), 1 deletion(-)

diff --git 
a/server/src/main/java/org/apache/rocketmq/studio/provider/apache/RocketMQAdminClientImpl.java
 
b/server/src/main/java/org/apache/rocketmq/studio/provider/apache/RocketMQAdminClientImpl.java
index cd1ae9aa3..a96c85fcd 100644
--- 
a/server/src/main/java/org/apache/rocketmq/studio/provider/apache/RocketMQAdminClientImpl.java
+++ 
b/server/src/main/java/org/apache/rocketmq/studio/provider/apache/RocketMQAdminClientImpl.java
@@ -102,7 +102,10 @@ public class RocketMQAdminClientImpl implements 
AdminClient {
                 if (routeData == null || routeData.getQueueDatas() == null || 
routeData.getQueueDatas().isEmpty()) {
                     throw new BusinessException(404, "Topic not found: " + 
name);
                 }
-                var qd = routeData.getQueueDatas().get(0);
+                var qd = routeData.getQueueDatas().stream()
+                        .filter(queueData -> queueData != null)
+                        .findFirst()
+                        .orElseThrow(() -> new BusinessException(404, "Topic 
not found: " + name));
                 TopicVO vo = new TopicVO();
                 vo.setName(name);
                 vo.setWriteQueues(qd.getWriteQueueNums());
diff --git 
a/server/src/test/java/org/apache/rocketmq/studio/provider/apache/RocketMQAdminClientImplTest.java
 
b/server/src/test/java/org/apache/rocketmq/studio/provider/apache/RocketMQAdminClientImplTest.java
index 1ced0f60e..3b1f66c18 100644
--- 
a/server/src/test/java/org/apache/rocketmq/studio/provider/apache/RocketMQAdminClientImplTest.java
+++ 
b/server/src/test/java/org/apache/rocketmq/studio/provider/apache/RocketMQAdminClientImplTest.java
@@ -29,6 +29,8 @@ import 
org.apache.rocketmq.remoting.protocol.admin.OffsetWrapper;
 import org.apache.rocketmq.remoting.protocol.ResponseCode;
 import org.apache.rocketmq.remoting.protocol.body.ClusterInfo;
 import org.apache.rocketmq.remoting.protocol.route.BrokerData;
+import org.apache.rocketmq.remoting.protocol.route.QueueData;
+import org.apache.rocketmq.remoting.protocol.route.TopicRouteData;
 import 
org.apache.rocketmq.remoting.protocol.subscription.SubscriptionGroupConfig;
 import org.apache.rocketmq.studio.cluster.broker.MqAdminExtFactory;
 import org.apache.rocketmq.studio.cluster.broker.MqClientPool;
@@ -56,6 +58,7 @@ import org.mockito.ArgumentCaptor;
 import org.mockito.Mock;
 import org.mockito.junit.jupiter.MockitoExtension;
 
+import java.util.Arrays;
 import java.util.HashMap;
 import java.util.HashSet;
 import java.util.List;
@@ -118,6 +121,34 @@ class RocketMQAdminClientImplTest {
                 runtimeAdminClientResolver, clientPool);
     }
 
+    @Test
+    void getTopicUsesFirstUsableQueueData() throws Exception {
+        QueueData queueData = new QueueData();
+        queueData.setReadQueueNums(4);
+        queueData.setWriteQueueNums(6);
+        TopicRouteData routeData = new TopicRouteData();
+        routeData.setQueueDatas(Arrays.asList(null, queueData));
+        when(adminExt.examineTopicRouteInfo("orders")).thenReturn(routeData);
+
+        TopicVO topic = adminClient.getTopic("orders");
+
+        assertThat(topic.getName()).isEqualTo("orders");
+        assertThat(topic.getReadQueues()).isEqualTo(4);
+        assertThat(topic.getWriteQueues()).isEqualTo(6);
+    }
+
+    @Test
+    void getTopicReturnsNotFoundWhenAllQueueDataIsNull() throws Exception {
+        TopicRouteData routeData = new TopicRouteData();
+        routeData.setQueueDatas(java.util.Collections.singletonList(null));
+        when(adminExt.examineTopicRouteInfo("orders")).thenReturn(routeData);
+
+        assertThatThrownBy(() -> adminClient.getTopic("orders"))
+                .isInstanceOf(BusinessException.class)
+                .hasMessage("Topic not found: orders")
+                .satisfies(error -> assertThat(((BusinessException) 
error).getCode()).isEqualTo(404));
+    }
+
     @Test
     void getConsumerGroupReturnsOfflineDetailForConsumerNotOnline() throws 
Exception {
         when(adminExt.examineConsumerConnectionInfo("orders"))

Reply via email to