1. 程式人生 > >RabbitMQ客戶端原始碼分析(六)之IntAllocator

RabbitMQ客戶端原始碼分析(六)之IntAllocator

RabbitMQ-java-client版本

  1. com.rabbitmq:amqp-client:4.3.0
  2. RabbitMQ版本宣告: 3.6.15

IntAllocator

  1. 用於分配給定範圍的Integer。主要用於產生channelNumber。核心是通過BitSet來進行Integer的分配與釋放。

  2. 分配channelNumber是在ChannelManager構造方法中

        channelMax = (1 << 16) - 1;
        channelNumberAllocator = new IntAllocator(1, channelMax);
    
  3. IntAllocator

    的成員變數與建構函式。傳入引數按照上面的(1,channelMax)傳入,來分析具體的執行值

        
        private final int loRange;     
        private final int hiRange; 
        private final int numberOfBits;     
        private int lastIndex = 0;   
        private final BitSet freeSet;
        //建立一個[bottom,top]返回的BitSet,從這個範圍分配整數
        public IntAllocator(int bottom,
    int top) { this.loRange = bottom;//1 this.hiRange = top + 1;//65535+1 this.numberOfBits = hiRange - loRange;//65535 this.freeSet = new BitSet(this.numberOfBits); //[0,this.numberOfBits)範圍設定為true,表示可以分配 this.freeSet.set(0, this.numberOfBits); //[0,65535) }
  4. 分配一個整數

        public int allocate() {
            //返回上次分配的索引
            int setIndex = this.freeSet.nextSetBit(this.lastIndex); //0
            if (setIndex<0) { // means none found in trailing part
                setIndex = this.freeSet.nextSetBit(0);
            }
            if (setIndex<0) return -1;
            //賦值設定上次分配的索引
            this.lastIndex = setIndex;
            //設定為false表示已經分配,此時(this.lastIndex,this.numberOfBits) 都是true,只有this.lastIndex是false
            this.freeSet.clear(setIndex);
            return setIndex + this.loRange;//0+1
        }
    
    
  5. 釋放channelNumber

    
        channelNumberAllocator.free(channelNumber);
    
        //將BitSet的index設定為true表示已經可以繼續利用
        public void free(int reservation) {
            this.freeSet.set(reservation - this.loRange);
        }