RabbitMQ客户端源码分析(五)之ConsumerWorkSerivce与WorkPool

本文深入分析了RabbitMQ-java-client 3.6.15版本的WorkPool机制,包括VariableLinkedBlockingQueue和SetQueue的实现。WorkPool作为任务池,管理Channel与任务的关系。VariableLinkedBlockingQueue是可变容量的阻塞队列,而SetQueue是一个不允许重复元素的队列。ConsumerWorkService负责处理Channel任务,ConsumerDispatcher则进行消费者通知事件的分发。
摘要由CSDN通过智能技术生成

RabbitMQ-java-client版本

  1. com.rabbitmq:amqp-client:4.3.0
  2. RabbitMQ版本声明: 3.6.15

WorkPool

  1. WorkPool可以认为是一个任务池,保存client(在这里实际类型其实就是Channel)与具体处理任务的关系

  2. 成员变量,SetQueueVariableLinkedBlockingQueue在下面详细说明

        //默认最大队列长度
        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>();
    
    
  3. 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));
                }
            }
        }
    
    
  4. 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);
             
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值