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"))