![JAR search and dependency download from the Maven repository](/logo.png)
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 super Long> 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