task-77: 统一 Coze、品牌检查和紫鸟 HTTP 客户端的连接复用策略
This commit is contained in:
@@ -0,0 +1,45 @@
|
||||
package com.nanri.aiimage.config;
|
||||
|
||||
import org.springframework.http.client.ClientHttpRequestFactory;
|
||||
import org.springframework.http.client.JdkClientHttpRequestFactory;
|
||||
|
||||
import java.net.http.HttpClient;
|
||||
import java.time.Duration;
|
||||
|
||||
/**
|
||||
* Task 77:外部 HTTP 客户端统一连接复用池。
|
||||
* Coze / 品牌检查 / 紫鸟三个外部客户端共用同一个 java.net.http.HttpClient
|
||||
* (内置 keep-alive 连接池),避免各自新建短命客户端导致连接无法复用、
|
||||
* 每次请求都重新建连。各客户端按自身超时创建独立的
|
||||
* JdkClientHttpRequestFactory(共享底层连接池),RestClient 单例懒加载。
|
||||
*/
|
||||
public class HttpClientPool {
|
||||
|
||||
private static volatile HttpClient sharedHttpClient;
|
||||
|
||||
/** 共享连接池实例:单一 HttpClient 承载全部外部调用的连接复用。 */
|
||||
public static HttpClient sharedHttpClient() {
|
||||
HttpClient client = sharedHttpClient;
|
||||
if (client != null) {
|
||||
return client;
|
||||
}
|
||||
synchronized (HttpClientPool.class) {
|
||||
if (sharedHttpClient == null) {
|
||||
sharedHttpClient = HttpClient.newBuilder()
|
||||
.connectTimeout(Duration.ofSeconds(10))
|
||||
.version(HttpClient.Version.HTTP_1_1)
|
||||
.build();
|
||||
}
|
||||
return sharedHttpClient;
|
||||
}
|
||||
}
|
||||
|
||||
/** 按 readTimeout(毫秒)创建共享连接池工厂;非法值钳制到最小正数。 */
|
||||
public static ClientHttpRequestFactory requestFactory(int readTimeoutMillis) {
|
||||
int safeReadTimeout = Math.max(1, readTimeoutMillis);
|
||||
JdkClientHttpRequestFactory factory =
|
||||
new JdkClientHttpRequestFactory(sharedHttpClient());
|
||||
factory.setReadTimeout(Duration.ofMillis(safeReadTimeout));
|
||||
return factory;
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user