根据商品id,把它路由到对应的内存队列中

// 获取路由到的内存队列

private ArrayBlockingQueue getRoutingQueue(Integer productId) {

RequestQueue requestQueue = RequestQueue.getInstance();
//获取productId的hash值
String key = String.valueOf(productId);
int h;
int hash = (key == null) ? 0 : (h = key.hashCode()) ^ (h >>> 16);
//对hash值取模,将hash值路由到指定的内存队列中 
int index = (requestQueue.queueSize() - 1) & hash;
	
return requestQueue.getQueue(index);

}

// 请求内存队列

public class RequestQueue {

//内存队列
private List<ArrayBlockingQueue<Request>> queues = new ArrayList<ArrayBlockingQueue<Request>>();
//标识位map
private Map<Integer,Boolean> flagMap = new ConcurrentHashMap<Integer, Boolean>();

private static class Singleton{
	private static RequestQueue instance;
	static {
		instance = new RequestQueue();
	}
	private static RequestQueue getInstance() {
		return instance;
	}
	
}
public static RequestQueue getInstance() {
	return Singleton.getInstance();
}
/**
 * 增加一个内存队列
 * @param queue
 */
public void addQueue(ArrayBlockingQueue<Request> queue) {
	this.queues.add(queue);
}
/**
 * 获取内存队列数量
 * @return
 */
public int queueSize() {
	return queues.size();
}
/**
 * 获取内存队列
 * @param index
 * @return
 */
public ArrayBlockingQueue<Request> getQueue(int index){
	return queues.get(index);
}

public Map<Integer,Boolean> getFlagMap(){
	return flagMap;
}

}

posted on 2020-11-13 15:11  xiaomage0000  阅读(72)  评论(0)    收藏  举报