diff --git a/tools/src/main/java/org/apache/rocketmq/tools/admin/DefaultMQAdminExtImpl.java b/tools/src/main/java/org/apache/rocketmq/tools/admin/DefaultMQAdminExtImpl.java index d96b4b03bcc..adbcbc97f31 100644 --- a/tools/src/main/java/org/apache/rocketmq/tools/admin/DefaultMQAdminExtImpl.java +++ b/tools/src/main/java/org/apache/rocketmq/tools/admin/DefaultMQAdminExtImpl.java @@ -1480,6 +1480,9 @@ public void run() { if (ResponseCode.CONSUMER_NOT_ONLINE == e.getResponseCode()) { mt.setTrackType(TrackType.NOT_ONLINE); } + if (ResponseCode.BROADCAST_CONSUMPTION == e.getResponseCode()) { + mt.setTrackType(TrackType.CONSUME_BROADCASTING); + } mt.setExceptionDesc("CODE:" + e.getResponseCode() + " DESC:" + e.getErrorMessage()); result.add(mt); countDownLatch.countDown(); @@ -1488,6 +1491,9 @@ public void run() { if (ResponseCode.CONSUMER_NOT_ONLINE == e.getResponseCode()) { mt.setTrackType(TrackType.NOT_ONLINE); } + if (ResponseCode.BROADCAST_CONSUMPTION == e.getResponseCode()) { + mt.setTrackType(TrackType.CONSUME_BROADCASTING); + } mt.setExceptionDesc("CODE:" + e.getResponseCode() + " DESC:" + e.getErrorMessage()); result.add(mt); countDownLatch.countDown(); diff --git a/tools/src/test/java/org/apache/rocketmq/tools/admin/DefaultMQAdminExtImplTest.java b/tools/src/test/java/org/apache/rocketmq/tools/admin/DefaultMQAdminExtImplTest.java index c5ea051ab46..92d5e09523e 100644 --- a/tools/src/test/java/org/apache/rocketmq/tools/admin/DefaultMQAdminExtImplTest.java +++ b/tools/src/test/java/org/apache/rocketmq/tools/admin/DefaultMQAdminExtImplTest.java @@ -38,6 +38,7 @@ import org.apache.rocketmq.remoting.protocol.admin.TopicStatsTable; import org.apache.rocketmq.remoting.protocol.body.ClusterInfo; import org.apache.rocketmq.remoting.protocol.body.ConsumeMessageDirectlyResult; +import org.apache.rocketmq.remoting.protocol.body.Connection; import org.apache.rocketmq.remoting.protocol.body.ConsumerConnection; import org.apache.rocketmq.remoting.protocol.body.GroupList; import org.apache.rocketmq.remoting.protocol.body.QueueTimeSpan; @@ -46,6 +47,8 @@ import org.apache.rocketmq.remoting.protocol.body.TopicList; import org.apache.rocketmq.remoting.protocol.header.UpdateConsumerOffsetRequestHeader; import org.apache.rocketmq.remoting.protocol.header.UpdateGroupForbiddenRequestHeader; +import org.apache.rocketmq.remoting.protocol.heartbeat.ConsumeType; +import org.apache.rocketmq.remoting.protocol.heartbeat.MessageModel; import org.apache.rocketmq.remoting.protocol.heartbeat.SubscriptionData; import org.apache.rocketmq.remoting.protocol.route.BrokerData; import org.apache.rocketmq.remoting.protocol.route.QueueData; @@ -54,6 +57,7 @@ import org.apache.rocketmq.remoting.protocol.subscription.SubscriptionGroupConfig; import org.apache.rocketmq.tools.admin.api.BrokerOperatorResult; import org.apache.rocketmq.tools.admin.api.MessageTrack; +import org.apache.rocketmq.tools.admin.api.TrackType; import org.apache.rocketmq.tools.admin.common.AdminToolResult; import org.apache.rocketmq.tools.admin.common.AdminToolsResultCodeEnum; import org.junit.Before; @@ -91,6 +95,7 @@ import static org.mockito.ArgumentMatchers.anyInt; import static org.mockito.ArgumentMatchers.anyLong; import static org.mockito.ArgumentMatchers.anyString; +import static org.mockito.ArgumentMatchers.nullable; import static org.mockito.Mockito.doAnswer; import static org.mockito.Mockito.doNothing; import static org.mockito.Mockito.doThrow; @@ -626,6 +631,36 @@ public void testConsumeMessageDirectly() throws Exception { assertFalse(actual.isOrder()); } + @Test + public void testMessageTrackDetailConcurrentWithBroadcastGroup() throws Exception { + MessageExt messageExt = new MessageExt(); + messageExt.setTopic(defaultTopic); + messageExt.setQueueId(0); + messageExt.setStoreHost(new InetSocketAddress("127.0.0.1", 10911)); + + GroupList groupList = mock(GroupList.class); + HashSet groupSet = new HashSet<>(); + groupSet.add(defaultGroup); + when(groupList.getGroupList()).thenReturn(groupSet); + when(mqClientAPIImpl.queryTopicConsumeByWho(anyString(), anyString(), anyLong())).thenReturn(groupList); + + ConsumerConnection consumerConnection = new ConsumerConnection(); + HashSet connectionSet = new HashSet<>(); + connectionSet.add(new Connection()); + consumerConnection.setConnectionSet(connectionSet); + consumerConnection.setConsumeType(ConsumeType.CONSUME_PASSIVELY); + consumerConnection.setMessageModel(MessageModel.BROADCASTING); + when(mqClientAPIImpl.getConsumerConnectionList(anyString(), anyString(), anyLong())).thenReturn(consumerConnection); + + when(mqClientAPIImpl.getConsumeStats(anyString(), anyString(), nullable(String.class), anyLong())) + .thenReturn(new ConsumeStats()); + + List actual = defaultMQAdminExtImpl.messageTrackDetailConcurrent(messageExt); + + assertEquals(1, actual.size()); + assertEquals(TrackType.CONSUME_BROADCASTING, actual.get(0).getTrackType()); + } + @Test public void testMessageTrackDetailConcurrent() throws Exception { MessageExt messageExt = createMessageExt();