启用虚拟线程
概述
启用虚拟线程选项要求当前JDK
版本为JDK21+
。启用此选项之后,HTTP
客户端的sendAsync
和enqueue
系列方法会基于VirtualThreadPool
提供的工作线程执行HTTP
调用。
启用选项
创建HTTP
客户端时把HttpOptions.HTTP_THREAD_POOL
的值定义为virtual
即可。例如:
java
HttpClient httpClient = Solpic.newHttpClientBuilder()
.option(HttpOptions.HTTP_THREAD_POOL, "virtual")
.build();
可以根据当前Java
运行时版本进行动态判断和配置。例如:
java
Solpic.HttpClientBuilder builder = Solpic.newHttpClientBuilder();
// PlatformUtils是Solpic的一个工具类
if (PlatformUtils.X.getMajorVersion() >= 21) {
builder.option(HttpOptions.HTTP_THREAD_POOL, "virtual");
}
HttpClient httpClient = builder.build();
验证
把日志级别调整为DEBUG
并且进行异步HTTP
调用。示例代码:
java
public static void main(String[] args) throws Exception {
HttpClient httpClient = Solpic.newHttpClientBuilder()
.option(HttpOptions.HTTP_THREAD_POOL, "virtual")
.build();
HttpRequest request = HttpRequest.newBuilder()
.uri(URI.create("https://httpbin.org/get"))
.method(HttpMethod.GET)
.build();
CompletableFuture<HttpResponse<String>> f = httpClient.sendAsync(request, PayloadSubscribers.X.ofString());
HttpResponse<String> response = f.get();
int statusCode = response.getStatusCode().value();
String responseBody = response.getPayload();
System.out.println(statusCode);
System.out.println(responseBody);
}
某次调用输出日志:
shell
[2024-08-29 16:20:54,508] [DEBUG] cn.vlts.solpic.core.http.client.jhc.JdkHttpClientImpl [virtual-31] - [JdkHttpClientImpl-1]
- Prepare to send HTTP request, method: GET, uri: https://httpbin.org/get
[2024-08-29 16:20:56,406] [DEBUG] cn.vlts.solpic.core.http.client.jhc.JdkHttpClientImpl [virtual-31] - [JdkHttpClientImpl-1]
- Receive HTTP response, method: GET, uri: https://httpbin.org/get, status: 200
TIP
注意日志输出格式中需要打印线程名称才能观察到'virtual-n',例如在logback
中使用占位符[%thread]
输出线程名称。