Skip to content

Commit 6decbc5

Browse files
committed
[ISSUE #348] fix Some interaction issues with the consumer interface
1 parent 9cb185a commit 6decbc5

File tree

7 files changed

+50
-19
lines changed

7 files changed

+50
-19
lines changed

frontend-new/src/api/remoteApi/remoteApi.js

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -355,6 +355,7 @@ const remoteApi = {
355355
*/
356356
resendMessageDirectly: async (msgId, consumerGroup, topic) => {
357357
topic = encodeURIComponent(topic)
358+
consumerGroup = encodeURIComponent(consumerGroup)
358359
try {
359360
const response = await remoteApi._fetch(remoteApi.buildUrl(`/message/consumeMessageDirectly.do?msgId=${msgId}&consumerGroup=${consumerGroup}&topic=${topic}`), {
360361
method: 'POST',
@@ -392,6 +393,7 @@ const remoteApi = {
392393
},
393394

394395
refreshConsumerGroup: async (consumerGroup) => {
396+
consumerGroup = encodeURIComponent(consumerGroup)
395397
try {
396398
const response = await remoteApi._fetch(remoteApi.buildUrl(`/consumer/group.refresh?consumerGroup=${consumerGroup}`));
397399
const data = await response.json();
@@ -443,6 +445,7 @@ const remoteApi = {
443445
},
444446

445447
fetchBrokerNameList: async (consumerGroup) => {
448+
consumerGroup = encodeURIComponent(consumerGroup)
446449
try {
447450
const response = await remoteApi._fetch(remoteApi.buildUrl(`/consumer/fetchBrokerNameList.query?consumerGroup=${consumerGroup}`));
448451
const data = await response.json();
@@ -454,6 +457,7 @@ const remoteApi = {
454457
},
455458

456459
deleteConsumerGroup: async (groupName, brokerNameList) => {
460+
groupName = encodeURIComponent(groupName)
457461
try {
458462
const response = await remoteApi._fetch(remoteApi.buildUrl("/consumer/deleteSubGroup.do"), {
459463
method: 'POST',
@@ -471,6 +475,7 @@ const remoteApi = {
471475
},
472476

473477
queryConsumerConfig: async (consumerGroup) => {
478+
consumerGroup = encodeURIComponent(consumerGroup)
474479
try {
475480
const response = await remoteApi._fetch(remoteApi.buildUrl(`/consumer/examineSubscriptionGroupConfig.query?consumerGroup=${consumerGroup}`));
476481
const data = await response.json();
@@ -499,6 +504,7 @@ const remoteApi = {
499504
},
500505

501506
queryTopicByConsumer: async (consumerGroup, address) => {
507+
consumerGroup = encodeURIComponent(consumerGroup)
502508
try {
503509
const response = await remoteApi._fetch(remoteApi.buildUrl(`/consumer/queryTopicByConsumer.query?consumerGroup=${consumerGroup}&address=${address}`));
504510
const data = await response.json();
@@ -510,6 +516,7 @@ const remoteApi = {
510516
},
511517

512518
queryConsumerConnection: async (consumerGroup, address) => {
519+
consumerGroup = encodeURIComponent(consumerGroup)
513520
try {
514521
const response = await remoteApi._fetch(remoteApi.buildUrl(`/consumer/consumerConnection.query?consumerGroup=${consumerGroup}&address=${address}`));
515522
const data = await response.json();
@@ -521,6 +528,7 @@ const remoteApi = {
521528
},
522529

523530
queryConsumerRunningInfo: async (consumerGroup, clientId, jstack = false) => {
531+
consumerGroup = encodeURIComponent(consumerGroup)
524532
try {
525533
const response = await remoteApi._fetch(remoteApi.buildUrl(`/consumer/consumerRunningInfo.query?consumerGroup=${consumerGroup}&clientId=${clientId}&jstack=${jstack}`));
526534
const data = await response.json();

frontend-new/src/components/consumer/ClientInfoModal.jsx

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,7 @@ import {remoteApi} from '../../api/remoteApi/remoteApi';
2121
import {useLanguage} from '../../i18n/LanguageContext';
2222

2323

24-
const ClientInfoModal = ({visible, group, address, onCancel}) => {
24+
const ClientInfoModal = ({visible, group, address, onCancel, messageApi}) => {
2525
const {t} = useLanguage();
2626
const [loading, setLoading] = useState(false);
2727
const [connectionData, setConnectionData] = useState(null);
@@ -34,7 +34,11 @@ const ClientInfoModal = ({visible, group, address, onCancel}) => {
3434
try {
3535
const connResponse = await remoteApi.queryConsumerConnection(group, address);
3636

37-
if (connResponse.status === 0) setConnectionData(connResponse.data);
37+
if (connResponse.status === 0) {
38+
setConnectionData(connResponse.data);
39+
}else{
40+
messageApi.error(connResponse.errMsg);
41+
}
3842
} finally {
3943
setLoading(false);
4044
}

frontend-new/src/components/consumer/ConsumerDetailModal.jsx

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,7 @@ import {Modal, Spin, Table} from 'antd';
2020
import {remoteApi} from '../../api/remoteApi/remoteApi';
2121
import {useLanguage} from '../../i18n/LanguageContext';
2222

23-
const ConsumerDetailModal = ({visible, group, address, onCancel}) => {
23+
const ConsumerDetailModal = ({visible, group, address, onCancel ,messageApi}) => {
2424
const {t} = useLanguage();
2525
const [loading, setLoading] = useState(false);
2626
const [details, setDetails] = useState([]);
@@ -31,9 +31,14 @@ const ConsumerDetailModal = ({visible, group, address, onCancel}) => {
3131

3232
setLoading(true);
3333
try {
34+
console.log(`Fetching consumer details for group: ${group}, address: ${address}`);
3435
const response = await remoteApi.queryTopicByConsumer(group, address);
3536
if (response.status === 0) {
3637
setDetails(response.data);
38+
}else {
39+
// Handle error case
40+
messageApi.error(response.errMsg);
41+
setDetails([]);
3742
}
3843
} finally {
3944
setLoading(false);

frontend-new/src/components/consumer/DeleteConsumerModal.jsx

Lines changed: 1 addition & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -18,15 +18,12 @@
1818
import React, {useEffect, useState} from 'react';
1919
import {Button, Checkbox, Modal, notification, Spin} from 'antd';
2020
import {remoteApi} from '../../api/remoteApi/remoteApi';
21-
import {useLanguage} from '../../i18n/LanguageContext';
2221

23-
const DeleteConsumerModal = ({visible, group, onCancel, onSuccess}) => {
24-
const {t} = useLanguage();
22+
const DeleteConsumerModal = ({visible, group, onCancel, onSuccess, t}) => {
2523
const [brokerList, setBrokerList] = useState([]);
2624
const [selectedBrokers, setSelectedBrokers] = useState([]);
2725
const [loading, setLoading] = useState(false);
2826

29-
// 获取Broker列表
3027
useEffect(() => {
3128
const fetchBrokers = async () => {
3229
if (!visible) return;
@@ -45,7 +42,6 @@ const DeleteConsumerModal = ({visible, group, onCancel, onSuccess}) => {
4542
fetchBrokers();
4643
}, [visible, group]);
4744

48-
// 处理删除提交
4945
const handleDelete = async () => {
5046
if (selectedBrokers.length === 0) {
5147
notification.warning({message: t.PLEASE_SELECT_BROKER});

frontend-new/src/i18n/index.js

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -592,9 +592,10 @@ export const translations = {
592592
"EXPRESSION_TYPE": "Expression Type",
593593
"SUB_VERSION": "Sub Version",
594594
"CODE_SET": "Code Set",
595-
"TAGS_SET": "Tags Set"
596-
597-
595+
"TAGS_SET": "Tags Set",
596+
"DELETE_CONSUMER_GROUP": "Delete Consumer Group",
597+
"SELECT_DELETE_BROKERS": "Please select brokers to delete consumer group",
598+
"CONFIRM_DELETE": "Confirm Delete",
598599
}
599600

600601
};

frontend-new/src/pages/Consumer/consumer.jsx

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -288,7 +288,6 @@ const ConsumerGroupList = () => {
288288
setShowConfig(true);
289289
};
290290

291-
// 修改操作按钮的点击处理函数
292291
const handleClient = (group, address) => {
293292
setSelectedGroup(group);
294293
setSelectedAddress(address);
@@ -550,19 +549,20 @@ const ConsumerGroupList = () => {
550549
/>
551550
</Spin>
552551

553-
{/* 模态框组件保持不变 */}
554552
<ClientInfoModal
555553
visible={showClientInfo}
556554
group={selectedGroup}
557555
address={selectedAddress}
558556
onCancel={() => setShowClientInfo(false)}
557+
messageApi={messageApi}
559558
/>
560559

561560
<ConsumerDetailModal
562561
visible={showConsumeDetail}
563562
group={selectedGroup}
564563
address={selectedAddress}
565564
onCancel={() => setShowConsumeDetail(false)}
565+
messageApi={messageApi}
566566
/>
567567

568568
<ConsumerConfigModal
@@ -579,6 +579,7 @@ const ConsumerGroupList = () => {
579579
group={selectedGroup}
580580
onCancel={() => setShowDeleteModal(false)}
581581
onSuccess={loadConsumerGroups}
582+
t={t}
582583
/>
583584
</div>
584585
</>

src/main/java/org/apache/rocketmq/dashboard/service/impl/ConsumerServiceImpl.java

Lines changed: 22 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -283,6 +283,7 @@ public GroupConsumeInfo queryGroup(String consumerGroup, String address) {
283283

284284
@Override
285285
public List<TopicConsumerInfo> queryConsumeStatsListByGroupName(String groupName, String address) {
286+
groupName = getConsumerGroup(groupName);
286287
List<ConsumeStats> consumeStatses = new ArrayList<>();
287288
String topic = null;
288289
try {
@@ -295,16 +296,18 @@ public List<TopicConsumerInfo> queryConsumeStatsListByGroupName(String groupName
295296
throw new RuntimeException(e);
296297
}
297298
List<TopicConsumerInfo> res = new ArrayList<>();
299+
String finalGroupName = groupName;
298300
consumeStatses.forEach(consumeStats -> {
299301
if (consumeStats != null && consumeStats.getOffsetTable() != null && !consumeStats.getOffsetTable().isEmpty()) {
300-
res.addAll(toTopicConsumerInfoList(topic, consumeStats, groupName));
302+
res.addAll(toTopicConsumerInfoList(topic, consumeStats, finalGroupName));
301303
}
302304
});
303305
return res;
304306
}
305307

306308
@Override
307309
public List<TopicConsumerInfo> queryConsumeStatsList(final String topic, String groupName) {
310+
groupName = getConsumerGroup(groupName);
308311
ConsumeStats consumeStats = null;
309312
try {
310313
consumeStats = mqAdminExt.examineConsumeStats(groupName, topic);
@@ -316,6 +319,7 @@ public List<TopicConsumerInfo> queryConsumeStatsList(final String topic, String
316319
}
317320

318321
private List<TopicConsumerInfo> toTopicConsumerInfoList(String topic, ConsumeStats consumeStats, String groupName) {
322+
groupName = getConsumerGroup(groupName);
319323
List<MessageQueue> mqList = Lists.newArrayList(Iterables.filter(consumeStats.getOffsetTable().keySet(), new Predicate<MessageQueue>() {
320324
@Override
321325
public boolean apply(MessageQueue o) {
@@ -339,6 +343,7 @@ public boolean apply(MessageQueue o) {
339343
}
340344

341345
private Map<MessageQueue, String> getClientConnection(String groupName) {
346+
groupName = getConsumerGroup(groupName);
342347
Map<MessageQueue, String> results = Maps.newHashMap();
343348
try {
344349
ConsumerConnection consumerConnection = mqAdminExt.examineConsumerConnectionInfo(groupName);
@@ -417,17 +422,18 @@ public Map<String, ConsumerGroupRollBackStat> resetOffset(ResetOffsetRequest res
417422
}
418423

419424
@Override
420-
public List<ConsumerConfigInfo> examineSubscriptionGroupConfig(String group) {
425+
public List<ConsumerConfigInfo> examineSubscriptionGroupConfig(String consumerGroup) {
426+
consumerGroup = getConsumerGroup(consumerGroup);
421427
List<ConsumerConfigInfo> consumerConfigInfoList = Lists.newArrayList();
422428
try {
423429
ClusterInfo clusterInfo = clusterInfoService.get();
424430
for (String brokerName : clusterInfo.getBrokerAddrTable().keySet()) { //foreach brokerName
425431
String brokerAddress = clusterInfo.getBrokerAddrTable().get(brokerName).selectBrokerAddr();
426432
SubscriptionGroupConfig subscriptionGroupConfig = null;
427433
try {
428-
subscriptionGroupConfig = mqAdminExt.examineSubscriptionGroupConfig(brokerAddress, group);
434+
subscriptionGroupConfig = mqAdminExt.examineSubscriptionGroupConfig(brokerAddress, consumerGroup);
429435
} catch (Exception e) {
430-
logger.warn("op=examineSubscriptionGroupConfig_error brokerName={} group={}", brokerName, group);
436+
logger.warn("op=examineSubscriptionGroupConfig_error brokerName={} group={}", brokerName, consumerGroup);
431437
}
432438
if (subscriptionGroupConfig == null) {
433439
continue;
@@ -480,6 +486,7 @@ private void deleteResources(String topic, String brokerName, ClusterInfo cluste
480486

481487
@Override
482488
public boolean createAndUpdateSubscriptionGroupConfig(ConsumerConfigInfo consumerConfigInfo) {
489+
consumerConfigInfo.getSubscriptionGroupConfig().setGroupName(getConsumerGroup(consumerConfigInfo.getSubscriptionGroupConfig().getGroupName()));
483490
try {
484491
ClusterInfo clusterInfo = clusterInfoService.get();
485492
for (String brokerName : changeToBrokerNameSet(clusterInfo.getClusterAddrTable(),
@@ -495,6 +502,7 @@ public boolean createAndUpdateSubscriptionGroupConfig(ConsumerConfigInfo consume
495502

496503
@Override
497504
public Set<String> fetchBrokerNameSetBySubscriptionGroup(String group) {
505+
group = getConsumerGroup(group);
498506
Set<String> brokerNameSet = Sets.newHashSet();
499507
try {
500508
List<ConsumerConfigInfo> consumerConfigInfoList = examineSubscriptionGroupConfig(group);
@@ -511,6 +519,7 @@ public Set<String> fetchBrokerNameSetBySubscriptionGroup(String group) {
511519

512520
@Override
513521
public ConsumerConnection getConsumerConnection(String consumerGroup, String address) {
522+
consumerGroup = getConsumerGroup(consumerGroup);
514523
try {
515524
String[] addresses = address.split(",");
516525
String addr = addresses[0];
@@ -523,6 +532,7 @@ public ConsumerConnection getConsumerConnection(String consumerGroup, String add
523532

524533
@Override
525534
public ConsumerRunningInfo getConsumerRunningInfo(String consumerGroup, String clientId, boolean jstack) {
535+
consumerGroup = getConsumerGroup(consumerGroup);
526536
try {
527537
return mqAdminExt.getConsumerRunningInfo(consumerGroup, clientId, jstack);
528538
} catch (Exception e) {
@@ -533,15 +543,14 @@ public ConsumerRunningInfo getConsumerRunningInfo(String consumerGroup, String c
533543

534544
@Override
535545
public GroupConsumeInfo refreshGroup(String address, String consumerGroup) {
536-
537546
if (isCacheBeingBuilt || cacheConsumeInfoList.isEmpty()) {
538547
throw new RuntimeException("Cache is being built or empty, please try again later");
539548
}
540549
synchronized (cacheConsumeInfoList) {
541550
for (int i = 0; i < cacheConsumeInfoList.size(); i++) {
542551
GroupConsumeInfo groupConsumeInfo = cacheConsumeInfoList.get(i);
543552
if (groupConsumeInfo.getGroup().equals(consumerGroup)) {
544-
GroupConsumeInfo updatedInfo = queryGroup(consumerGroup, "");
553+
GroupConsumeInfo updatedInfo = queryGroup(consumerGroup, address);
545554
updatedInfo.setUpdateTime(new Date());
546555
updatedInfo.setGroup(consumerGroup);
547556
updatedInfo.setAddress(consumerGroupMap.get(consumerGroup));
@@ -559,4 +568,11 @@ public List<GroupConsumeInfo> refreshAllGroup(String address) {
559568
consumerGroupMap.clear();
560569
return queryGroupList(false, address);
561570
}
571+
572+
public String getConsumerGroup(String consumerGroup) {
573+
if (consumerGroup != null && consumerGroup.startsWith("%SYS%")) {
574+
return consumerGroup.substring(5); // Remove "%SYS%" prefix
575+
}
576+
return consumerGroup;
577+
}
562578
}

0 commit comments

Comments
 (0)