private void closeAsync(CompletableFuture<?> future) {
        final List<CompletableFuture<?>> dependencies = new ArrayList<>(pools.size());
        for (final Iterator<HttpChannelPool> i = pools.values().iterator(); i.hasNext();) {
            dependencies.add(i.next().closeAsync());
            i.remove();
        }

        addressResolverGroup.close();

        CompletableFuture.allOf(dependencies.toArray(EMPTY_FUTURES)).handle((unused, cause) -> {
            if (cause != null) {
                logger.warn("Failed to close {}s:", HttpChannelPool.class.getSimpleName(), cause);
            }

            if (autoCloseConnectionPoolListener) {
                connectionPoolListener.close();
            }
            if (shutdownWorkerGroupOnClose) {
                workerGroup.shutdownGracefully().addListener((FutureListener<Object>) f -> {
                    if (f.cause() != null) {
                        logger.warn("Failed to shut down a worker group:", f.cause());
                    }
                    future.complete(null);
                });
            } else {
                future.complete(null);
            }
            return null;
        });
    }
Returns a new {@link Bootstrap} for connecting to a {@link io.netty.channel.unix.DomainSocketAddress}.
The returned {@link Bootstrap} has its {@link ChannelFactory}, {@link AddressResolverGroup} and
socket options pre-configured.
core/src/main/java/com/linecorp/armeria/client/HttpClientFactory.java