文章目录
RabbitMQ-java-client版本
com.rabbitmq:amqp-client:4.3.0RabbitMQ版本声明: 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_VALUEpublic 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);

本文深入分析了RabbitMQ-java-client 3.6.15版本的WorkPool机制,包括VariableLinkedBlockingQueue和SetQueue的实现。WorkPool作为任务池,管理Channel与任务的关系。VariableLinkedBlockingQueue是可变容量的阻塞队列,而SetQueue是一个不允许重复元素的队列。ConsumerWorkService负责处理Channel任务,ConsumerDispatcher则进行消费者通知事件的分发。
最低0.47元/天 解锁文章
311

被折叠的 条评论
为什么被折叠?



