
org.apache.rocketmq.remoting.rpc.ClientMetadata Maven / Gradle / Ivy
/*
* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership.
* The ASF licenses this file to You under the Apache License, Version 2.0
* (the "License"); you may not use this file except in compliance with
* the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.apache.rocketmq.remoting.rpc;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.ConcurrentMap;
import org.apache.rocketmq.common.MixAll;
import org.apache.rocketmq.common.constant.LoggerName;
import org.apache.rocketmq.common.message.MessageQueue;
import org.apache.rocketmq.logging.org.slf4j.Logger;
import org.apache.rocketmq.logging.org.slf4j.LoggerFactory;
import org.apache.rocketmq.remoting.protocol.body.ClusterInfo;
import org.apache.rocketmq.remoting.protocol.route.BrokerData;
import org.apache.rocketmq.remoting.protocol.route.TopicRouteData;
import org.apache.rocketmq.remoting.protocol.statictopic.TopicQueueMappingInfo;
import org.apache.rocketmq.remoting.protocol.statictopic.TopicQueueMappingUtils;
public class ClientMetadata {
private static final Logger log = LoggerFactory.getLogger(LoggerName.COMMON_LOGGER_NAME);
private final ConcurrentMap topicRouteTable = new ConcurrentHashMap<>();
private final ConcurrentMap > topicEndPointsTable = new ConcurrentHashMap<>();
private final ConcurrentMap > brokerAddrTable =
new ConcurrentHashMap<>();
private final ConcurrentMap> brokerVersionTable =
new ConcurrentHashMap<>();
public void freshTopicRoute(String topic, TopicRouteData topicRouteData) {
if (topic == null
|| topicRouteData == null) {
return;
}
TopicRouteData old = this.topicRouteTable.get(topic);
if (!topicRouteData.topicRouteDataChanged(old)) {
return ;
}
{
for (BrokerData bd : topicRouteData.getBrokerDatas()) {
this.brokerAddrTable.put(bd.getBrokerName(), bd.getBrokerAddrs());
}
}
{
ConcurrentMap mqEndPoints = topicRouteData2EndpointsForStaticTopic(topic, topicRouteData);
if (mqEndPoints != null
&& !mqEndPoints.isEmpty()) {
topicEndPointsTable.put(topic, mqEndPoints);
}
}
}
public String getBrokerNameFromMessageQueue(final MessageQueue mq) {
if (topicEndPointsTable.get(mq.getTopic()) != null
&& !topicEndPointsTable.get(mq.getTopic()).isEmpty()) {
return topicEndPointsTable.get(mq.getTopic()).get(mq);
}
return mq.getBrokerName();
}
public void refreshClusterInfo(ClusterInfo clusterInfo) {
if (clusterInfo == null
|| clusterInfo.getBrokerAddrTable() == null) {
return;
}
for (Map.Entry entry : clusterInfo.getBrokerAddrTable().entrySet()) {
brokerAddrTable.put(entry.getKey(), entry.getValue().getBrokerAddrs());
}
}
public String findMasterBrokerAddr(String brokerName) {
if (!brokerAddrTable.containsKey(brokerName)) {
return null;
}
return brokerAddrTable.get(brokerName).get(MixAll.MASTER_ID);
}
public ConcurrentMap> getBrokerAddrTable() {
return brokerAddrTable;
}
public static ConcurrentMap topicRouteData2EndpointsForStaticTopic(final String topic, final TopicRouteData route) {
if (route.getTopicQueueMappingByBroker() == null
|| route.getTopicQueueMappingByBroker().isEmpty()) {
return new ConcurrentHashMap<>();
}
ConcurrentMap mqEndPointsOfBroker = new ConcurrentHashMap<>();
Map> mappingInfosByScope = new HashMap<>();
for (Map.Entry entry : route.getTopicQueueMappingByBroker().entrySet()) {
TopicQueueMappingInfo info = entry.getValue();
String scope = info.getScope();
if (scope != null) {
if (!mappingInfosByScope.containsKey(scope)) {
mappingInfosByScope.put(scope, new HashMap<>());
}
mappingInfosByScope.get(scope).put(entry.getKey(), entry.getValue());
}
}
for (Map.Entry> mapEntry : mappingInfosByScope.entrySet()) {
String scope = mapEntry.getKey();
Map topicQueueMappingInfoMap = mapEntry.getValue();
ConcurrentMap mqEndPoints = new ConcurrentHashMap<>();
List> mappingInfos = new ArrayList<>(topicQueueMappingInfoMap.entrySet());
mappingInfos.sort((o1, o2) -> (int) (o2.getValue().getEpoch() - o1.getValue().getEpoch()));
int maxTotalNums = 0;
long maxTotalNumOfEpoch = -1;
for (Map.Entry entry : mappingInfos) {
TopicQueueMappingInfo info = entry.getValue();
if (info.getEpoch() >= maxTotalNumOfEpoch && info.getTotalQueues() > maxTotalNums) {
maxTotalNums = info.getTotalQueues();
}
for (Map.Entry idEntry : entry.getValue().getCurrIdMap().entrySet()) {
int globalId = idEntry.getKey();
MessageQueue mq = new MessageQueue(topic, TopicQueueMappingUtils.getMockBrokerName(info.getScope()), globalId);
TopicQueueMappingInfo oldInfo = mqEndPoints.get(mq);
if (oldInfo == null || oldInfo.getEpoch() <= info.getEpoch()) {
mqEndPoints.put(mq, info);
}
}
}
//accomplish the static logic queues
for (int i = 0; i < maxTotalNums; i++) {
MessageQueue mq = new MessageQueue(topic, TopicQueueMappingUtils.getMockBrokerName(scope), i);
if (!mqEndPoints.containsKey(mq)) {
mqEndPointsOfBroker.put(mq, MixAll.LOGICAL_QUEUE_MOCK_BROKER_NAME_NOT_EXIST);
} else {
mqEndPointsOfBroker.put(mq, mqEndPoints.get(mq).getBname());
}
}
}
return mqEndPointsOfBroker;
}
}
© 2015 - 2025 Weber Informatics LLC | Privacy Policy