public ChannelBufferPool(
      final int minIdle,
      final int writeBufferPoolSize,
      final long validationInterval,
      AtmosphereConfig config) {
    this.writeBufferPoolSize = writeBufferPoolSize;

    initialize(minIdle);

    if (writeBufferPoolSize != -1) {
      ExecutorsFactory.getScheduler(config)
          .scheduleWithFixedDelay(
              new Runnable() {
                @Override
                public void run() {
                  int size = pool.size();
                  if (size < minIdle) {
                    int sizeToBeAdded = minIdle - size;
                    for (int i = 0; i < sizeToBeAdded; i++) {
                      pool.add(createObject());
                    }
                  } else if (size > writeBufferPoolSize) {
                    int sizeToBeRemoved = size - writeBufferPoolSize;
                    for (int i = 0; i < sizeToBeRemoved; i++) {
                      pool.poll();
                    }
                  }
                }
              },
              validationInterval,
              validationInterval,
              TimeUnit.SECONDS);

      config.shutdownHook(
          new AtmosphereConfig.ShutdownHook() {
            @Override
            public void shutdown() {
              pool.clear();
            }
          });
    }
  }