Skip to content

Commit

Permalink
Merge branch '3.2.x'
Browse files Browse the repository at this point in the history
Closes gh-39542
  • Loading branch information
wilkinsona committed Feb 14, 2024
2 parents 22952c3 + 256f9fe commit 63efdff
Show file tree
Hide file tree
Showing 2 changed files with 36 additions and 10 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -34,6 +34,7 @@
import org.springframework.boot.autoconfigure.http.codec.CodecsAutoConfiguration;
import org.springframework.boot.autoconfigure.task.TaskExecutionAutoConfiguration;
import org.springframework.boot.autoconfigure.template.TemplateAvailabilityProviders;
import org.springframework.boot.autoconfigure.thread.Threading;
import org.springframework.boot.autoconfigure.validation.ValidationAutoConfiguration;
import org.springframework.boot.autoconfigure.validation.ValidatorAdapter;
import org.springframework.boot.autoconfigure.web.ConditionalOnEnabledResourceChain;
Expand All @@ -55,6 +56,7 @@
import org.springframework.context.annotation.ImportRuntimeHints;
import org.springframework.core.Ordered;
import org.springframework.core.annotation.Order;
import org.springframework.core.env.Environment;
import org.springframework.core.task.AsyncTaskExecutor;
import org.springframework.format.FormatterRegistry;
import org.springframework.format.support.FormattingConversionService;
Expand Down Expand Up @@ -149,6 +151,8 @@ public static class WebFluxConfig implements WebFluxConfigurer {

private static final Log logger = LogFactory.getLog(WebFluxConfig.class);

private final Environment environment;

private final Resources resourceProperties;

private final WebFluxProperties webFluxProperties;
Expand All @@ -163,11 +167,12 @@ public static class WebFluxConfig implements WebFluxConfigurer {

private final ObjectProvider<ViewResolver> viewResolvers;

public WebFluxConfig(WebProperties webProperties, WebFluxProperties webFluxProperties,
public WebFluxConfig(Environment environment, WebProperties webProperties, WebFluxProperties webFluxProperties,
ListableBeanFactory beanFactory, ObjectProvider<HandlerMethodArgumentResolver> resolvers,
ObjectProvider<CodecCustomizer> codecCustomizers,
ObjectProvider<ResourceHandlerRegistrationCustomizer> resourceHandlerRegistrationCustomizer,
ObjectProvider<ViewResolver> viewResolvers) {
this.environment = environment;
this.resourceProperties = webProperties.getResources();
this.webFluxProperties = webFluxProperties;
this.beanFactory = beanFactory;
Expand All @@ -189,7 +194,8 @@ public void configureHttpMessageCodecs(ServerCodecConfigurer configurer) {

@Override
public void configureBlockingExecution(BlockingExecutionConfigurer configurer) {
if (this.beanFactory.containsBean(TaskExecutionAutoConfiguration.APPLICATION_TASK_EXECUTOR_BEAN_NAME)) {
if (Threading.VIRTUAL.isActive(this.environment) && this.beanFactory
.containsBean(TaskExecutionAutoConfiguration.APPLICATION_TASK_EXECUTOR_BEAN_NAME)) {
Object taskExecutor = this.beanFactory
.getBean(TaskExecutionAutoConfiguration.APPLICATION_TASK_EXECUTOR_BEAN_NAME);
if (taskExecutor instanceof AsyncTaskExecutor asyncTaskExecutor) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -39,6 +39,8 @@
import org.assertj.core.api.Assertions;
import org.assertj.core.api.InstanceOfAssertFactories;
import org.junit.jupiter.api.Test;
import org.junit.jupiter.api.condition.EnabledForJreRange;
import org.junit.jupiter.api.condition.JRE;
import org.junit.jupiter.params.ParameterizedTest;
import org.junit.jupiter.params.provider.ValueSource;

Expand Down Expand Up @@ -704,8 +706,20 @@ void problemDetailsExceptionHandlerIsOrderedAt0() {
}

@Test
void asyncTaskExecutorWithApplicationTaskExecutor() {
void asyncTaskExecutorWithPlatformThreadsAndApplicationTaskExecutor() {
this.contextRunner.withConfiguration(AutoConfigurations.of(TaskExecutionAutoConfiguration.class))
.run((context) -> {
assertThat(context).hasSingleBean(AsyncTaskExecutor.class);
assertThat(context.getBean(RequestMappingHandlerAdapter.class)).extracting("scheduler.executor")
.isNull();
});
}

@Test
@EnabledForJreRange(min = JRE.JAVA_21)
void asyncTaskExecutorWithVirtualThreadsAndApplicationTaskExecutor() {
this.contextRunner.withPropertyValues("spring.threads.virtual.enabled=true")
.withConfiguration(AutoConfigurations.of(TaskExecutionAutoConfiguration.class))
.run((context) -> {
assertThat(context).hasSingleBean(AsyncTaskExecutor.class);
assertThat(context.getBean(RequestMappingHandlerAdapter.class)).extracting("scheduler.executor")
Expand All @@ -714,8 +728,10 @@ void asyncTaskExecutorWithApplicationTaskExecutor() {
}

@Test
void asyncTaskExecutorWithNonMatchApplicationTaskExecutorBean() {
this.contextRunner.withUserConfiguration(CustomApplicationTaskExecutorConfig.class)
@EnabledForJreRange(min = JRE.JAVA_21)
void asyncTaskExecutorWithVirtualThreadsAndNonMatchApplicationTaskExecutorBean() {
this.contextRunner.withPropertyValues("spring.threads.virtual.enabled=true")
.withUserConfiguration(CustomApplicationTaskExecutorConfig.class)
.withConfiguration(AutoConfigurations.of(TaskExecutionAutoConfiguration.class))
.run((context) -> {
assertThat(context).doesNotHaveBean(AsyncTaskExecutor.class);
Expand All @@ -725,22 +741,26 @@ void asyncTaskExecutorWithNonMatchApplicationTaskExecutorBean() {
}

@Test
void asyncTaskExecutorWithWebFluxConfigurerCanOverrideExecutor() {
this.contextRunner.withUserConfiguration(CustomAsyncTaskExecutorConfigurer.class)
@EnabledForJreRange(min = JRE.JAVA_21)
void asyncTaskExecutorWithVirtualThreadsAndWebFluxConfigurerCanOverrideExecutor() {
this.contextRunner.withPropertyValues("spring.threads.virtual.enabled=true")
.withUserConfiguration(CustomAsyncTaskExecutorConfigurer.class)
.withConfiguration(AutoConfigurations.of(TaskExecutionAutoConfiguration.class))
.run((context) -> assertThat(context.getBean(RequestMappingHandlerAdapter.class))
.extracting("scheduler.executor")
.isSameAs(context.getBean(CustomAsyncTaskExecutorConfigurer.class).taskExecutor));
}

@Test
void asyncTaskExecutorWithCustomNonApplicationTaskExecutor() {
this.contextRunner.withUserConfiguration(CustomAsyncTaskExecutorConfig.class)
@EnabledForJreRange(min = JRE.JAVA_21)
void asyncTaskExecutorWithVirtualThreadsAndCustomNonApplicationTaskExecutor() {
this.contextRunner.withPropertyValues("spring.threads.virtual.enabled=true")
.withUserConfiguration(CustomAsyncTaskExecutorConfig.class)
.withConfiguration(AutoConfigurations.of(TaskExecutionAutoConfiguration.class))
.run((context) -> {
assertThat(context).hasSingleBean(AsyncTaskExecutor.class);
assertThat(context.getBean(RequestMappingHandlerAdapter.class)).extracting("scheduler.executor")
.isNotSameAs(context.getBean("customTaskExecutor"));
.isNull();
});
}

Expand Down

0 comments on commit 63efdff

Please sign in to comment.