25
25
import org .apache .rocketmq .common .constant .PermName ;
26
26
import org .apache .rocketmq .common .protocol .ResponseCode ;
27
27
import org .apache .rocketmq .common .protocol .body .ClusterInfo ;
28
+ import org .apache .rocketmq .common .protocol .route .BrokerData ;
29
+ import org .apache .rocketmq .common .protocol .route .QueueData ;
30
+ import org .apache .rocketmq .common .protocol .route .TopicRouteData ;
28
31
import org .apache .rocketmq .remoting .exception .RemotingException ;
29
32
import org .apache .rocketmq .srvutil .ServerUtil ;
30
33
import org .apache .rocketmq .tools .admin .DefaultMQAdminExt ;
35
38
import org .slf4j .LoggerFactory ;
36
39
37
40
import java .util .ArrayList ;
41
+ import java .util .HashMap ;
38
42
import java .util .HashSet ;
39
43
import java .util .List ;
40
44
import java .util .Set ;
@@ -45,7 +49,7 @@ public class RocketMQUtil {
45
49
private static final List <String > existTopic = new ArrayList <>();
46
50
47
51
//neither static topic nor compact topic. expansion with source topic.
48
- public static void createNormalTopic (DefaultMQAdminExt mqAdmin , String topicName , int queueNum , Set <String > clusters ) throws Exception {
52
+ public static void createNormalTopic (DefaultMQAdminExt mqAdmin , String topicName , int totalQueueNum , Set <String > clusters ) throws Exception {
49
53
if (check (mqAdmin , topicName )) {
50
54
logger .info ("topic[{}] already exist." , topicName );
51
55
return ;
@@ -55,20 +59,68 @@ public static void createNormalTopic(DefaultMQAdminExt mqAdmin, String topicName
55
59
clusters = getCluster (mqAdmin );
56
60
}
57
61
58
- TopicConfig topicConfig = new TopicConfig (topicName , queueNum , queueNum , PermName .PERM_READ | PermName .PERM_WRITE );
59
62
60
63
for (String cluster : clusters ) {
61
64
Set <String > masterSet = CommandUtil .fetchMasterAddrByClusterName (mqAdmin , cluster );
62
65
63
- for (String addr : masterSet ) {
64
- mqAdmin .createAndUpdateTopicConfig (addr , topicConfig );
65
- logger .info ("create topic to broker:{} cluster:{}, success." , addr , cluster );
66
+ int remainder = totalQueueNum % masterSet .size ();
67
+ if (remainder != 0 ) {
68
+ String temp = String .format ("can not create topic:%s, total num=%s, master num=%s" , topicName , totalQueueNum , masterSet .size ());
69
+ logger .warn (temp );
66
70
}
71
+
72
+ int queueNumInEachBroker = totalQueueNum / masterSet .size ();
73
+ TopicConfig topicConfig = new TopicConfig (topicName , queueNumInEachBroker , queueNumInEachBroker , PermName .PERM_READ | PermName .PERM_WRITE );
74
+
75
+ if (remainder == 0 ) {
76
+ for (String addr : masterSet ) {
77
+ mqAdmin .createAndUpdateTopicConfig (addr , topicConfig );
78
+ logger .info ("create topic to broker:{} cluster:{}, success." , addr , cluster );
79
+ }
80
+ } else {
81
+ String [] masterArray = masterSet .toArray (new String []{});
82
+
83
+ topicConfig = new TopicConfig (topicName , queueNumInEachBroker + remainder ,
84
+ queueNumInEachBroker + remainder , PermName .PERM_READ | PermName .PERM_WRITE );
85
+ mqAdmin .createAndUpdateTopicConfig (masterArray [0 ], topicConfig );
86
+
87
+ for (int i = 1 ; i < masterArray .length ; i ++) {
88
+ topicConfig = new TopicConfig (topicName , queueNumInEachBroker , queueNumInEachBroker , PermName .PERM_READ | PermName .PERM_WRITE );
89
+ mqAdmin .createAndUpdateTopicConfig (masterArray [0 ], topicConfig );
90
+ }
91
+ }
92
+
93
+ }
94
+ }
95
+
96
+ public static void createNormalTopic (DefaultMQAdminExt mqAdmin , String sourceTopic , String stateTopic ) throws Exception {
97
+ //找到brokerAddr
98
+ TopicRouteData topicRouteData = mqAdmin .examineTopicRouteInfo (sourceTopic );
99
+ List <QueueData > queueData = topicRouteData .getQueueDatas ();
100
+ List <BrokerData > brokerData = topicRouteData .getBrokerDatas ();
101
+
102
+
103
+ HashMap <String , String > brokerName2MaterBrokerAddr = new HashMap <>();
104
+ for (BrokerData broker : brokerData ) {
105
+ String masterBrokerAddr = broker .getBrokerAddrs ().get (0L );
106
+ brokerName2MaterBrokerAddr .put (broker .getBrokerName (), masterBrokerAddr );
67
107
}
108
+
109
+ for (QueueData queue : queueData ) {
110
+ int readQueueNums = queue .getReadQueueNums ();
111
+ int writeQueueNums = queue .getWriteQueueNums ();
112
+ String brokerName = queue .getBrokerName ();
113
+
114
+ TopicConfig topicConfig = new TopicConfig (stateTopic , readQueueNums , writeQueueNums );
115
+
116
+ mqAdmin .createAndUpdateTopicConfig (brokerName2MaterBrokerAddr .get (brokerName ), topicConfig );
117
+ }
118
+
119
+ existTopic .add (stateTopic );
68
120
}
69
121
70
122
//used in RSQLDB,maybe.
71
- public static void createStaticCompactTopic (DefaultMQAdminExt mqAdmin , String topicName , int queueNum , Set <String > clusters ) throws Exception {
123
+ public static void createStaticCompactTopic (DefaultMQAdminExt mqAdmin , String topicName , int totalQueueNum , Set <String > clusters ) throws Exception {
72
124
if (check (mqAdmin , topicName )) {
73
125
logger .info ("topic[{}] already exist." , topicName );
74
126
return ;
@@ -80,15 +132,15 @@ public static void createStaticCompactTopic(DefaultMQAdminExt mqAdmin, String to
80
132
81
133
82
134
for (String cluster : clusters ) {
83
- createStaticTopicWithCommand (topicName , queueNum , new HashSet <>(), cluster , mqAdmin .getNamesrvAddr ());
84
- logger .info ("【step 1】create static topic:[{}] in cluster:[{}] success, logic queue num:[{}]." , topicName , cluster , queueNum );
135
+ createStaticTopicWithCommand (topicName , totalQueueNum , new HashSet <>(), cluster , mqAdmin .getNamesrvAddr ());
136
+ logger .info ("【step 1】create static topic:[{}] in cluster:[{}] success, logic queue num:[{}]." , topicName , cluster , totalQueueNum );
85
137
86
- update2CompactTopicWithCommand (topicName , queueNum , cluster , mqAdmin .getNamesrvAddr ());
138
+ update2CompactTopicWithCommand (topicName , totalQueueNum , cluster , mqAdmin .getNamesrvAddr ());
87
139
logger .info ("【step 2】update static topic to compact topic success. topic:[{}], cluster:[{}]" , topicName , cluster );
88
140
}
89
141
90
142
existTopic .add (topicName );
91
- logger .info ("create static-compact topic [{}] success, queue num [{}]" , topicName , queueNum );
143
+ logger .info ("create static-compact topic [{}] success, queue num [{}]" , topicName , totalQueueNum );
92
144
}
93
145
94
146
public static void createStaticTopic (DefaultMQAdminExt mqAdmin , String topicName , int queueNum ) throws Exception {
@@ -106,23 +158,23 @@ public static void createStaticTopic(DefaultMQAdminExt mqAdmin, String topicName
106
158
existTopic .add (topicName );
107
159
}
108
160
109
- private static void createStaticTopicWithCommand (String topic , int queueNum , Set <String > brokers , String cluster , String nameservers ) throws Exception {
161
+ private static void createStaticTopicWithCommand (String topic , int totalQueueNum , Set <String > brokers , String cluster , String nameservers ) throws Exception {
110
162
UpdateStaticTopicSubCommand cmd = new UpdateStaticTopicSubCommand ();
111
163
Options options = ServerUtil .buildCommandlineOptions (new Options ());
112
164
String [] args ;
113
165
if (cluster != null ) {
114
166
args = new String []{
115
167
"-c" , cluster ,
116
168
"-t" , topic ,
117
- "-qn" , String .valueOf (queueNum ),
169
+ "-qn" , String .valueOf (totalQueueNum ),
118
170
"-n" , nameservers
119
171
};
120
172
} else {
121
173
String brokerStr = String .join ("," , brokers );
122
174
args = new String []{
123
175
"-b" , brokerStr ,
124
176
"-t" , topic ,
125
- "-qn" , String .valueOf (queueNum ),
177
+ "-qn" , String .valueOf (totalQueueNum ),
126
178
"-n" , nameservers
127
179
};
128
180
}
0 commit comments