文章目录
RabbitMQ-java-client版本
com.rabbitmq:amqp-client:4.3.0
RabbitMQ
版本声明: 3.6.15
WorkPool
-
WorkPool可以认为是一个任务池,保存
client
(在这里实际类型其实就是Channel
)与具体处理任务的关系 -
成员变量,
SetQueue
和VariableLinkedBlockingQueue
在下面详细说明//默认最大队列长度 private static final int MAX_QUEUE_LENGTH = 1000; /**就绪的clients集合,SetQueue本质是一个LinkedList+Set*/ private final SetQueue<K> ready = new SetQueue<K>(); /** 正在处理的client集合*/ private final Set<K> inProgress = new HashSet<K>(); /** 保存注册的Channel与处理的任务队列 */ private final Map<K, VariableLinkedBlockingQueue<W>> pool = new HashMap<K, VariableLinkedBlockingQueue<W>>(); /** 保存限制被移除的key的集合,如果不为空,不限制队列大小 */ private final Set<K> unlimited = new HashSet<K>();
-
registerKey(K key)
: Channel所对应的任务队列长度取决于是否限制队列长度,如果限制队列长度最大MAX_QUEUE_LENGTH(1000)
,不限制就是Integer.MAX_VALUE
public void registerKey(K key) { synchronized (this) { if (!this.pool.containsKey(key)) { int initialCapacity = unlimited.isEmpty() ? MAX_QUEUE_LENGTH : Integer.MAX_VALUE; this.pool.put(key, new VariableLinkedBlockingQueue<W>(initialCapacity)); } } }
-
nextWorkBlock(Collection<W> to, int size)
:返回下一个准备就绪的Channel,并从该Channel对应的任务队列里取出size个任务放在传入的参数Collection中。public K nextWorkBlock(Collection<W> to, int size) { synchronized (this) { //从就绪队列中取出一个Channel K nextKey = readyToInProgress(); if (nextKey != null) { //获取Channel对应的任务队列 VariableLinkedBlockingQueue<W> queue = this.pool.get(nextKey);