docs: public MessageExchange take() throws BufferStoppedException, InterruptedException {
          MessageExchange currentExchange = null;
          try {
              idleConsumers.getAndIncrement();
              currentExchange = requests.take();
          } finally {
              idleConsumers.getAndDecrement();
          }
  
          if (status == Status.STOPPING && requests.size() <= 1) {
              status = Status.STOPPED;            
          }
  
          if (currentExchange == POISON) {
              putPoison();
              throw new BufferStoppedException();
          } else {
              listener.valuesChanged(this, consumersIdle(), requestsWaiting());
              diagnose("Took one request from buffer.");
              return currentExchange;
          }
      }