java

关注公众号 jb51net

关闭
首页 > 软件编程 > java > springboot使用虚拟线程

Java21在spring boot中使用虚拟线程的方法

作者:不死的精灵

本文给大家介绍Java21在spring boot中使用虚拟线程的方法,结合实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧

前置知识

虚拟线程VT(Virtual Thread)

0.环境说明

用于验证的版本:

spring boot 3.1中就支持使用jdk21的虚拟线程了,但是在spring boot 3.2中可以直接通过配置的方式开启虚拟线程。不过本文编写的时候spring boot 3.3.3已经GA了,他在3.2的基础上又对虚拟线程进行了进一步地适配,所以本文章中的版本为3.3

在spring boot 3.2.9中配置spring.threads.virtual.enabled=true即可启用虚拟线程

1.原理解析

开启了这个配置后,对我们的spring boot服务有什么影响呢?

我们在spring boot的源码中搜索spring.threads.virtual.enabled即可看到这个配置在spring boot中生效在了什么地方。
首先我们可以看到如下的代码(通过代码注释也能看出,这个配置就是在3.2.0引入的)

/**
 * Threading of the application.
 *
 * @author Moritz Halbritter
 * @since 3.2.0
 */
public enum Threading {
	/**
	 * Platform threads. Active if virtual threads are not active.
	 */
	PLATFORM {
		@Override
		public boolean isActive(Environment environment) {
			return !VIRTUAL.isActive(environment);
		}
	},
	/**
	 * Virtual threads. Active if {@code spring.threads.virtual.enabled} is {@code true}
	 * and running on Java 21 or later.
	 */
	VIRTUAL {
		@Override
		public boolean isActive(Environment environment) {
			return environment.getProperty("spring.threads.virtual.enabled", boolean.class, false)
					&& JavaVersion.getJavaVersion().isEqualOrNewerThan(JavaVersion.TWENTY_ONE);
		}
	};
	/**
	 * Determines whether the threading is active.
	 * @param environment the environment
	 * @return whether the threading is active
	 */
	public abstract boolean isActive(Environment environment);
}

接下来我们看一下VIRTUAL.isActive(environment)这个方法都用在了哪里(哪里用到了,就说明哪里的虚拟线程是通过这个配置生效的)

可以看到他被用在如下的地方:

2.spring boot的方案

通过在spring boot的源码搜索@ConditionalOnThreading(Threading.VIRTUAL),可以看到spring boot会根据虚拟线程的开启与否来选择注入不同的bean,我们以spring-data-redis为例,其具体代码如下:

    @Bean
	@ConditionalOnMissingBean(RedisConnectionFactory.class)
	@ConditionalOnThreading(Threading.PLATFORM)
	LettuceConnectionFactory redisConnectionFactory(
			ObjectProvider<LettuceClientConfigurationBuilderCustomizer> builderCustomizers,
			ClientResources clientResources) {
		return createConnectionFactory(builderCustomizers, clientResources);
	}
	@Bean
	@ConditionalOnMissingBean(RedisConnectionFactory.class)
	@ConditionalOnThreading(Threading.VIRTUAL)
	LettuceConnectionFactory redisConnectionFactoryVirtualThreads(
			ObjectProvider<LettuceClientConfigurationBuilderCustomizer> builderCustomizers,
			ClientResources clientResources) {
		LettuceConnectionFactory factory = createConnectionFactory(builderCustomizers, clientResources);
		SimpleAsyncTaskExecutor executor = new SimpleAsyncTaskExecutor("redis-");
		executor.setVirtualThreads(true);
		factory.setExecutor(executor);
		return factory;
	}

通过代码不难看出,spring boot 3.2通过@ConditionalOnThreading注解的方式,实现了虚拟线程和平台线程的动态配置。

如果我们自己需要开发一个能够同时支持平台线程和虚拟线程的sdk,可以复用这个注解。

3.注意事项(施工中,欢迎补充)

到此这篇关于Java21在spring boot中使用虚拟线程的方法的文章就介绍到这了,更多相关springboot使用虚拟线程内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

您可能感兴趣的文章:
阅读全文