Spring Boot项目启用虚拟线程
- 开始
- 基本使用
- 先写一个测试方法
- 通过springboot配置项开启虚拟线程
- 目前存在的问题
开始
虚拟线程正式发布是在JDK21,对于Spring Boot版本选择3以上。
基本使用
关于虚拟线程本身的使用,之前已经介绍过。这里要说的是直接将Spring Boot项目的http请求处理的线程换成虚拟线程。
先写一个测试方法
写一个简单的方法查看当前线程信息
@RestController
@Slf4j
public class DemoController {
@GetMapping("demo")
public void demo() {
Thread thread = Thread.currentThread();
log.info("当前线程, id = {}, name = {}, isVirtual = {}", thread.threadId(), thread.getName(), thread.isVirtual());
}
}
通过springboot配置项开启虚拟线程
官方文档
spring:
main:
# 由于虚拟线程是守护线程,如果JVM所有线程都是虚拟线程,JVM会直接退出。因此官方建议开启以下属性避免主线程退出JVM
keep-alive: true
threads:
virtual:
enabled: true
目前存在的问题
实际测试下来,这种配置方式在使用undertow作为web容器时没有生效。官方文档中暂时没看到相关说明,暂时只有通过自定义 UndertowServletWebServerFactory来实现
@Configuration
public class UndertowConfig implements WebServerFactoryCustomizer<UndertowServletWebServerFactory> {
@Override
public void customize(UndertowServletWebServerFactory factory) {
// 创建虚拟线程执行器
// ExecutorService virtualThreadExecutor = Executors.newVirtualThreadPerTaskExecutor();
factory.addDeploymentInfoCustomizers(deploymentInfo -> {
deploymentInfo.setExecutor(Executors.newVirtualThreadPerTaskExecutor());
deploymentInfo.setAsyncExecutor(Executors.newVirtualThreadPerTaskExecutor());
});
}
}
- 以上方式使用jdk内置的方法创建Executor,如果要自定义一些属性可以自定义方法
public static ExecutorService newVirtualThreadPerTaskExecutor() {
Thread.Builder.OfVirtual builder = Thread.ofVirtual();
builder.name("under-vir-", 0);
ThreadFactory factory = builder.factory();
return newThreadPerTaskExecutor(factory);
}