@Override protected ChannelPool newPool(HttpChannelKey key) { Bootstrap bootstrap = new Bootstrap() .remoteAddress(key.host, key.port) .group(key.execution.getEventLoop()) .channel(TransportDetector.getSocketChannelImpl()) .option(ChannelOption.CONNECT_TIMEOUT_MILLIS, (int) key.connectTimeout.toMillis()) .option(ChannelOption.ALLOCATOR, spec.byteBufAllocator) .option(ChannelOption.AUTO_READ, false) .option(ChannelOption.SO_KEEPALIVE, isPooling()); if (isPooling()) { InstrumentedChannelPoolHandler channelPoolHandler = getPoolingHandler(key); hostStats.put(key.host, channelPoolHandler); CleanClosingFixedChannelPool channelPool = new CleanClosingFixedChannelPool(bootstrap, channelPoolHandler, getPoolSize(), getPoolQueueSize()); ((ExecControllerInternal) key.execution.getController()).onClose(() -> { remove(key); channelPool.closeCleanly(); }); return channelPool; } else { InstrumentedChannelPoolHandler channelPoolHandler = getSimpleHandler(key); hostStats.put(key.host, channelPoolHandler); return new SimpleChannelPool(bootstrap, channelPoolHandler, ALWAYS_UNHEALTHY); } } };