demo如下,如果是多个节点的服务,就相应替换为全局队列(如redis队列)处理.
public static void main(String[] args) {
/*
* 测试按比例下发数据
*/
int i = 1000000;//模拟请求次数
int countA = 0;
int countB = 0;
int countC = 0;
LinkedBlockingDeque l = new LinkedBlockingDeque();
while (i >0){
//保证队列有数据
initQueData(l);
if (l.isEmpty()){
//队列没数据,直接退出
break;
}
//取出第一个
Object first = l.removeFirst();
System.out.println("取出--->"+ first);
if (ObjectUtil.equal(first, "a")){
countA++;
}
if (ObjectUtil.equal(first, "b")){
countB++;
}
if (ObjectUtil.equal(first, "c")){
countC++;
}
i--;
}
System.out.println("end:a="+countA+"----b="+countB+"----c="+countC);
}
/**
* 初始化数据
* @methodName initQueData
* @param l
*/
private static void initQueData(LinkedBlockingDeque l) {
//队列没有数据就进行初始化
if (l.isEmpty()){
int a = 5;//50%的比例
int b = 3;
int c = 2;
add2Que("a",a,l);
add2Que("b",b,l);
add2Que("c",c,l);
}
}
/**
* 添加数据
* @methodName add2Que
* @param id
* @param size
* @param l
*/
private static void add2Que(String id, int size, LinkedBlockingDeque l) {
if (size <= 0){
return;
}
List<String> list = new ArrayList<>(size);
while (size > 0){
list.add(id);
size--;
}
if (CollectionUtil.isNotEmpty(list)){
l.addAll(list);
}
}