542928492 commented on issue #2223:
URL: https://github.com/apache/rocketmq/issues/2223#issuecomment-668014843
`Reproduce code`
import org.apache.rocketmq.client.common.ThreadLocalIndex;
import org.apache.rocketmq.common.message.MessageQueue;
import java.util.ArrayList;
import java.util.List;
public class MQTEST {
public static List<MessageQueue> messageQueueList = new ArrayList<>();
private static volatile ThreadLocalIndex sendWhichQueue = new
ThreadLocalIndex();
public static void main(String[] args) {
for (int i=0;i<8;i++){
MessageQueue mq = new MessageQueue();
mq.setBrokerName("b1");
mq.setQueueId(i);
mq.setTopic("TT");
messageQueueList.add(mq);
}
for (int i=0;i<8;i++){
MessageQueue mq = new MessageQueue();
mq.setBrokerName("b2");
mq.setQueueId(i);
mq.setTopic("TT");
messageQueueList.add(mq);
}
for (int i=0;i<8;i++){
MessageQueue mq = new MessageQueue();
mq.setBrokerName("b3");
mq.setQueueId(i);
mq.setTopic("TT");
messageQueueList.add(mq);
}
MessageQueue mq = new MessageQueue();
mq.setBrokerName("c1");
mq.setQueueId(0);
mq.setTopic("TT");
messageQueueList.add(mq);
MessageQueue mq2 = new MessageQueue();
mq2.setBrokerName("c2");
mq2.setQueueId(0);
mq2.setTopic("TT");
messageQueueList.add(mq2);
MessageQueue mqtmp = null;
for ( int times = 0; times < 3; times++) {
String lastBrokerName = null == mqtmp ? null :
mqtmp.getBrokerName();
mqtmp= selectOneMessageQueue(lastBrokerName);
System.out.println(mqtmp.getBrokerName());
}
}
public static MessageQueue selectOneMessageQueue(final String
lastBrokerName) {
if (lastBrokerName == null) {
return selectOneMessageQueue();
} else {
int index = sendWhichQueue.getAndIncrement();
for (int i = 0; i < messageQueueList.size(); i++) {
int pos = Math.abs(index++) % messageQueueList.size();
if (pos < 0)
pos = 0;
MessageQueue mq = messageQueueList.get(pos);
if (!mq.getBrokerName().equals(lastBrokerName)) {
return mq;
}
}
return selectOneMessageQueue();
}
}
public static MessageQueue selectOneMessageQueue() {
int index = sendWhichQueue.getAndIncrement();
int pos = Math.abs(index) % messageQueueList.size();
if (pos < 0)
pos = 0;
return messageQueueList.get(pos);
}
}
----------------------------------------------------------------
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.
For queries about this service, please contact Infrastructure at:
[email protected]