批量发送一次不能超过1m
所以面对海量消息需要进行分割后发送mq
一下是代码案例,及使用案例
package com.donghao.rocketmq.batch;
import org.apache.rocketmq.common.message.Message;
import org.springframework.cache.Cache;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import static com.sun.corba.se.impl.util.RepositoryId.cache;
/**
* 批量发送一次不能超过4m
* 所以面对海量消息需要进行分割后发送mq
* 迭代器
*
* @author donghao.wu
*/
public class ListSplitter implements Iterator<List<Message>> {
private final int SIZE_LIMIT = 1024 * 1024 * 1;
private final List<Message> messages;
private int currIndex;
public ListSplitter(List<Message> messages) {
this.messages = messages;
}
@Override
public boolean hasNext() {
return currIndex < messages.size();
}
@Override
public List<Message> next() {
int nextIndex = currIndex;
int totalSize = 0;
for (; nextIndex < messages.size(); nextIndex++) {
Message message = messages.get(nextIndex);
int tmpSize = message.getTopic().length() + message.getBody().length;
Map<String, String> properties = message.getProperties();
for (Map.Entry<String, String> entry : properties.entrySet()) {
tmpSize += entry.getKey().length() + entry.getValue().length();
}
//日志开销 20字节
tmpSize = tmpSize + 20;
if (tmpSize + totalSize > SIZE_LIMIT) {
break;
} else {
totalSize += tmpSize;
}
}
List<Message> subList = messages.subList(currIndex, nextIndex);
currIndex=nextIndex;
return subList;
}
/*
使用案例
public static void main(String[] args) {
ListSplitter splitter = new ListSplitter(messages);
while(splitter.hasNext()){
try{
producer.send(splitter.next());
}catch (Exception e){
e.printStackTrace();
}
}
}
*/
}