Spring框架启用Java最新虚拟线程技术

22-10-12 banq

使用最新版本的 Spring Framework、Spring Boot 和 Apache Tomcat,您可以开始自己进行试验。您开始分析虚拟线程如何影响您的应用程序工作负载,并对虚拟线程使用与平台线程使用进行基准测试。要自定义 Spring Boot 应用程序以处理虚拟线程上的 servlet 请求,请应用以下自定义:

@Bean(TaskExecutionAutoConfiguration.APPLICATION_TASK_EXECUTOR_BEAN_NAME)
public AsyncTaskExecutor asyncTaskExecutor() {
  return new TaskExecutorAdapter(Executors.newVirtualThreadPerTaskExecutor());
}

@Bean
public TomcatProtocolHandlerCustomizer<?> protocolHandlerVirtualThreadExecutorCustomizer() {
  return protocolHandler -> {
    protocolHandler.setExecutor(Executors.newVirtualThreadPerTaskExecutor());
  };
}


我们正在尽一切努力使预览体验尽可能无缝,我们希望在Loom在新的OpenJDK版本中退出预览后提供一流的配置选项。

如果我们了解到核心框架中面向虚拟线程的优化的具体潜力,无论是某些同步使用点还是某些ThreadLocal的使用,我们会尽可能在即将发布的Spring Framework和Spring Boot维护版本中推出相应的改进措施,甚至在Loom全面上市之前。

虚拟线程不仅影响Spring Framework,还影响所有周边的集成,如数据库驱动、消息传递系统、HTTP客户端等。这些项目中有很多都意识到需要改进其同步行为,以释放Project Loom的全部潜力。


你的应用程序会从虚拟线程中受益吗?
我们可以说,最可能的情况是,如果你目前没有做任何异步的事情(甚至没有做Servlet 3.1风格的异步请求,否则你可能需要做一些修改,以便更好地保持一致),你就可以在几乎没有任何改变的情况下受益。当然,也必须有一些实际的I/O或其他线程停放,才能给Loom带来好处。

我们也相信,ReactiveX风格的API仍然是组成并发逻辑的强大方式,也是处理流的自然方式。我们认为虚拟线程是对反应式编程模型的补充,可以消除阻塞I/O的障碍,而纯粹使用虚拟线程处理无限的流仍然是一个挑战。ReactiveX是适用于并发场景的正确方法,其中声明性并发(如分散收集)很重要。底层的Reactive Streams规范为数据管道的需求、背压和取消定义了一个协议,而不局限于非阻塞API或特定的Thread使用。

 

1