package tech.powerjob.remote.http.vertx;
|
|
import io.vertx.core.Vertx;
|
import io.vertx.core.VertxOptions;
|
import io.vertx.core.http.HttpClient;
|
import io.vertx.core.http.HttpClientOptions;
|
import io.vertx.core.http.HttpServer;
|
import io.vertx.core.http.HttpServerOptions;
|
import lombok.extern.slf4j.Slf4j;
|
import org.apache.commons.lang3.StringUtils;
|
import tech.powerjob.common.OmsConstant;
|
import tech.powerjob.common.PowerJobDKey;
|
|
/**
|
* VertxInitializer
|
* PowerJob 只是将 vertx 作为 toolkit 使用
|
*
|
* @author tjq
|
* @since 2023/1/1
|
*/
|
@Slf4j
|
public class VertxInitializer {
|
|
/**
|
* 默认开启长连接,且 75S 超时
|
*/
|
private static final int DEFAULT_KEEP_ALIVE_TIMEOUT = 75;
|
|
private static final int CONNECTION_TIMEOUT_MS = 3000;
|
|
private static final int SERVER_IDLE_TIMEOUT_S = 300;
|
|
public static Vertx buildVertx() {
|
final int cpuCores = Runtime.getRuntime().availableProcessors();
|
VertxOptions options = new VertxOptions()
|
.setWorkerPoolSize(Math.max(16, 2 * cpuCores))
|
.setInternalBlockingPoolSize(Math.max(32, 4 * cpuCores));
|
log.info("[PowerJob-Vertx] use vertx options: {}", options);
|
return Vertx.vertx(options);
|
}
|
|
public static HttpServer buildHttpServer(Vertx vertx) {
|
HttpServerOptions httpServerOptions = new HttpServerOptions()
|
.setIdleTimeout(SERVER_IDLE_TIMEOUT_S);
|
tryEnableCompression(httpServerOptions);
|
log.info("[PowerJob-Vertx] use HttpServerOptions: {}", httpServerOptions.toJson());
|
return vertx.createHttpServer(httpServerOptions);
|
}
|
private static void tryEnableCompression(HttpServerOptions httpServerOptions) {
|
// 非核心组件,不直接依赖类(无 import),加载报错可忽略
|
try {
|
httpServerOptions
|
.addCompressor(io.netty.handler.codec.compression.StandardCompressionOptions.gzip())
|
.setCompressionSupported(true);
|
log.warn("[PowerJob-Vertx] enable server side compression successfully!");
|
} catch (Throwable t) {
|
log.warn("[PowerJob-Vertx] enable server side compression failed. The error is not fatal, but performance may be degraded", t);
|
}
|
}
|
|
public static HttpClient buildHttpClient(Vertx vertx) {
|
|
HttpClientOptions httpClientOptions = new HttpClientOptions()
|
.setMetricsName(OmsConstant.PACKAGE)
|
.setConnectTimeout(CONNECTION_TIMEOUT_MS)
|
.setMaxPoolSize(Math.max(8, Runtime.getRuntime().availableProcessors()) * 2);
|
|
// 长连接
|
String keepaliveTimeout = System.getProperty(PowerJobDKey.TRANSPORTER_KEEP_ALIVE_TIMEOUT, String.valueOf(DEFAULT_KEEP_ALIVE_TIMEOUT));
|
int keepaliveTimeoutInt = Integer.parseInt(keepaliveTimeout);
|
if (keepaliveTimeoutInt > 0) {
|
httpClientOptions.setKeepAlive(true).setKeepAliveTimeout(keepaliveTimeoutInt);
|
} else {
|
httpClientOptions.setKeepAlive(false);
|
}
|
|
// 压缩判定
|
String enableCompressing = System.getProperty(PowerJobDKey.TRANSPORTER_USE_COMPRESSING);
|
if (StringUtils.isNotEmpty(enableCompressing)) {
|
httpClientOptions.setTryUseCompression(StringUtils.equalsIgnoreCase(enableCompressing, Boolean.TRUE.toString()));
|
}
|
|
log.info("[PowerJob-Vertx] use HttpClientOptions: {}", httpClientOptions.toJson());
|
return vertx.createHttpClient(httpClientOptions);
|
}
|
|
}
|