All Downloads are FREE. Search and download functionalities are using the official Maven repository.

com.github.netty.protocol.servlet.http2.NettyHttp2ClientPool Maven / Gradle / Ivy

package com.github.netty.protocol.servlet.http2;

import com.github.netty.core.util.LoggerFactoryX;
import io.netty.channel.EventLoopGroup;
import io.netty.channel.nio.NioEventLoopGroup;
import io.netty.util.concurrent.Future;
import io.netty.util.concurrent.GenericFutureListener;
import io.netty.util.internal.PlatformDependent;

import javax.net.ssl.SSLException;
import java.io.Closeable;
import java.net.URL;
import java.net.UnknownHostException;
import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.ConcurrentHashMap;
import java.util.function.Function;

/**
 * http2 连接池 (因为http2是长连接)
 *
 * @author wangzihaogithub 2021年2月3日15:43:40
 */
public class NettyHttp2ClientPool extends ConcurrentHashMap> implements Closeable {
    private int connectTimeout = 5000;
    private int workerCount = 0;
    private int clientCount = 2;
    private volatile EventLoopGroup worker;

    @Override
    protected void finalize() throws Throwable {
        try {
            close();
        } finally {
            super.finalize();
        }
    }

    public NettyHttp2Client getIfCreate(URL url) {
        String cacheKey = url.getProtocol() + "//" + url.getHost() + ":" + url.getPort();
        List clients = computeIfAbsent(cacheKey, new Function>() {
            @Override
            public List apply(String s) {
                if (worker == null) {
                    synchronized (this) {
                        if (worker == null) {
                            worker = new NioEventLoopGroup(Math.max(workerCount, 4));
                        }
                    }
                }
                List list = new ChooserList<>();
                for (int i = 0; i < clientCount; i++) {
                    try {
                        list.add(new NettyHttp2Client(url, worker)
                                .connectTimeout(connectTimeout));
                    } catch (UnknownHostException | SSLException e) {
                        PlatformDependent.throwException(e);
                    }
                }
                return list;
            }
        });
        NettyHttp2Client client = ((ChooserList) clients).next();
        return client;
    }

    public int getConnectTimeout() {
        return connectTimeout;
    }

    public void setConnectTimeout(int connectTimeout) {
        this.connectTimeout = connectTimeout;
    }

    public int getWorkerCount() {
        return workerCount;
    }

    public void setWorkerCount(int workerCount) {
        this.workerCount = workerCount;
    }

    public int getClientCount() {
        return clientCount;
    }

    public void setClientCount(int clientCount) {
        this.clientCount = clientCount;
    }

    @Override
    public void close() {
        for (List clients : values()) {
            for (NettyHttp2Client client : clients) {
                client.close().addListener(new GenericFutureListener>() {
                    @Override
                    public void operationComplete(Future future) throws Exception {
                        LoggerFactoryX.getLogger(NettyHttp2ClientPool.class)
                                .info("http2 client close = {}", client.getRemoteAddress());
                    }
                });
            }
        }
        clear();
        EventLoopGroup worker = this.worker;
        if (worker != null && !worker.isShutdown()) {
            worker.shutdownGracefully();
        }
    }

    static class ChooserList extends ArrayList {
        private int i = 0;

        public T next() {
            return get(Math.abs(i++ % size()));
        }
    }
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy