Skip to content

Commit d102bb6

Browse files
committed
Create reusable default TaskScheduler configuration
Create a `DefaultTaskSchedulerConfiguration` for use when standard task scheduler beans are required. Closes gh-49280
1 parent cfee3f1 commit d102bb6

File tree

3 files changed

+72
-48
lines changed

3 files changed

+72
-48
lines changed
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,68 @@
1+
/*
2+
* Copyright 2012-present the original author or authors.
3+
*
4+
* Licensed under the Apache License, Version 2.0 (the "License");
5+
* you may not use this file except in compliance with the License.
6+
* You may obtain a copy of the License at
7+
*
8+
* https://www.apache.org/licenses/LICENSE-2.0
9+
*
10+
* Unless required by applicable law or agreed to in writing, software
11+
* distributed under the License is distributed on an "AS IS" BASIS,
12+
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13+
* See the License for the specific language governing permissions and
14+
* limitations under the License.
15+
*/
16+
17+
package org.springframework.boot.autoconfigure.task;
18+
19+
import org.springframework.boot.autoconfigure.condition.ConditionalOnBean;
20+
import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
21+
import org.springframework.boot.autoconfigure.condition.ConditionalOnThreading;
22+
import org.springframework.boot.task.SimpleAsyncTaskSchedulerBuilder;
23+
import org.springframework.boot.task.ThreadPoolTaskSchedulerBuilder;
24+
import org.springframework.boot.thread.Threading;
25+
import org.springframework.context.annotation.Bean;
26+
import org.springframework.context.annotation.Configuration;
27+
import org.springframework.scheduling.TaskScheduler;
28+
import org.springframework.scheduling.concurrent.SimpleAsyncTaskScheduler;
29+
import org.springframework.scheduling.concurrent.ThreadPoolTaskScheduler;
30+
import org.springframework.scheduling.config.TaskSchedulerRouter;
31+
32+
/**
33+
* Configuration that can be imported to expose a standard {@link TaskScheduler} if the
34+
* user has not enabled task scheduling explicitly. A {@link SimpleAsyncTaskScheduler} is
35+
* exposed if the user enables virtual threads via
36+
* {@code spring.threads.virtual.enabled=true}, otherwise {@link ThreadPoolTaskScheduler}.
37+
* <p>
38+
* Configurations importing this one should be ordered after
39+
* {@link TaskSchedulingAutoConfiguration}.
40+
*
41+
* @author Phillip Webb
42+
* @since 4.1.0
43+
*/
44+
@Configuration(proxyBeanMethods = false)
45+
@ConditionalOnMissingBean(name = DefaultTaskSchedulerConfiguration.DEFAULT_TASK_SCHEDULER_BEAN_NAME)
46+
public class DefaultTaskSchedulerConfiguration {
47+
48+
/**
49+
* The bean name of the default task scheduler.
50+
*/
51+
public static final String DEFAULT_TASK_SCHEDULER_BEAN_NAME = TaskSchedulerRouter.DEFAULT_TASK_SCHEDULER_BEAN_NAME;
52+
53+
@Bean(name = DEFAULT_TASK_SCHEDULER_BEAN_NAME)
54+
@ConditionalOnBean(ThreadPoolTaskSchedulerBuilder.class)
55+
@ConditionalOnThreading(Threading.PLATFORM)
56+
ThreadPoolTaskScheduler taskScheduler(ThreadPoolTaskSchedulerBuilder threadPoolTaskSchedulerBuilder) {
57+
return threadPoolTaskSchedulerBuilder.build();
58+
}
59+
60+
@Bean(name = DEFAULT_TASK_SCHEDULER_BEAN_NAME)
61+
@ConditionalOnBean(SimpleAsyncTaskSchedulerBuilder.class)
62+
@ConditionalOnThreading(Threading.VIRTUAL)
63+
SimpleAsyncTaskScheduler taskSchedulerVirtualThreads(
64+
SimpleAsyncTaskSchedulerBuilder simpleAsyncTaskSchedulerBuilder) {
65+
return simpleAsyncTaskSchedulerBuilder.build();
66+
}
67+
68+
}

core/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/task/TaskSchedulingConfigurations.java

Lines changed: 2 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -32,11 +32,10 @@
3232
import org.springframework.boot.thread.Threading;
3333
import org.springframework.context.annotation.Bean;
3434
import org.springframework.context.annotation.Configuration;
35+
import org.springframework.context.annotation.Import;
3536
import org.springframework.core.task.TaskDecorator;
3637
import org.springframework.core.task.support.CompositeTaskDecorator;
3738
import org.springframework.scheduling.TaskScheduler;
38-
import org.springframework.scheduling.concurrent.SimpleAsyncTaskScheduler;
39-
import org.springframework.scheduling.concurrent.ThreadPoolTaskScheduler;
4039
import org.springframework.scheduling.config.TaskManagementConfigUtils;
4140

4241
/**
@@ -58,20 +57,9 @@ class TaskSchedulingConfigurations {
5857
@Configuration(proxyBeanMethods = false)
5958
@ConditionalOnBean(name = TaskManagementConfigUtils.SCHEDULED_ANNOTATION_PROCESSOR_BEAN_NAME)
6059
@ConditionalOnMissingBean({ TaskScheduler.class, ScheduledExecutorService.class })
60+
@Import(DefaultTaskSchedulerConfiguration.class)
6161
static class TaskSchedulerConfiguration {
6262

63-
@Bean(name = "taskScheduler")
64-
@ConditionalOnThreading(Threading.VIRTUAL)
65-
SimpleAsyncTaskScheduler taskSchedulerVirtualThreads(SimpleAsyncTaskSchedulerBuilder builder) {
66-
return builder.build();
67-
}
68-
69-
@Bean
70-
@ConditionalOnThreading(Threading.PLATFORM)
71-
ThreadPoolTaskScheduler taskScheduler(ThreadPoolTaskSchedulerBuilder threadPoolTaskSchedulerBuilder) {
72-
return threadPoolTaskSchedulerBuilder.build();
73-
}
74-
7563
}
7664

7765
@Configuration(proxyBeanMethods = false)

module/spring-boot-integration/src/main/java/org/springframework/boot/integration/autoconfigure/IntegrationAutoConfiguration.java

Lines changed: 2 additions & 34 deletions
Original file line numberDiff line numberDiff line change
@@ -33,19 +33,16 @@
3333
import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
3434
import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
3535
import org.springframework.boot.autoconfigure.condition.ConditionalOnSingleCandidate;
36-
import org.springframework.boot.autoconfigure.condition.ConditionalOnThreading;
3736
import org.springframework.boot.autoconfigure.condition.SearchStrategy;
3837
import org.springframework.boot.autoconfigure.jmx.JmxAutoConfiguration;
3938
import org.springframework.boot.autoconfigure.jmx.JmxProperties;
39+
import org.springframework.boot.autoconfigure.task.DefaultTaskSchedulerConfiguration;
4040
import org.springframework.boot.autoconfigure.task.TaskSchedulingAutoConfiguration;
4141
import org.springframework.boot.context.properties.EnableConfigurationProperties;
4242
import org.springframework.boot.context.properties.PropertyMapper;
4343
import org.springframework.boot.context.properties.source.MutuallyExclusiveConfigurationPropertiesException;
4444
import org.springframework.boot.jdbc.init.DataSourceScriptDatabaseInitializer;
4545
import org.springframework.boot.sql.autoconfigure.init.OnDatabaseInitializationCondition;
46-
import org.springframework.boot.task.SimpleAsyncTaskSchedulerBuilder;
47-
import org.springframework.boot.task.ThreadPoolTaskSchedulerBuilder;
48-
import org.springframework.boot.thread.Threading;
4946
import org.springframework.context.ApplicationContext;
5047
import org.springframework.context.annotation.Bean;
5148
import org.springframework.context.annotation.Conditional;
@@ -69,8 +66,6 @@
6966
import org.springframework.messaging.rsocket.RSocketStrategies;
7067
import org.springframework.messaging.rsocket.annotation.support.RSocketMessageHandler;
7168
import org.springframework.scheduling.Trigger;
72-
import org.springframework.scheduling.concurrent.SimpleAsyncTaskScheduler;
73-
import org.springframework.scheduling.concurrent.ThreadPoolTaskScheduler;
7469
import org.springframework.scheduling.support.CronTrigger;
7570
import org.springframework.scheduling.support.PeriodicTrigger;
7671
import org.springframework.util.StringUtils;
@@ -93,6 +88,7 @@
9388
afterName = "org.springframework.boot.jdbc.autoconfigure.DataSourceAutoConfiguration")
9489
@ConditionalOnClass(EnableIntegration.class)
9590
@EnableConfigurationProperties({ IntegrationProperties.class, JmxProperties.class })
91+
@Import(DefaultTaskSchedulerConfiguration.class)
9692
public final class IntegrationAutoConfiguration {
9793

9894
@Bean(name = IntegrationContextUtils.INTEGRATION_GLOBAL_PROPERTIES_BEAN_NAME)
@@ -174,34 +170,6 @@ private Trigger createPeriodicTrigger(Duration period, @Nullable Duration initia
174170

175171
}
176172

177-
/**
178-
* Expose a standard {@link org.springframework.scheduling.TaskScheduler
179-
* TaskScheduler} if the user has not enabled task scheduling explicitly. A
180-
* {@link SimpleAsyncTaskScheduler} is exposed if the user enables virtual threads via
181-
* {@code spring.threads.virtual.enabled=true}, otherwise
182-
* {@link ThreadPoolTaskScheduler}.
183-
*/
184-
@Configuration(proxyBeanMethods = false)
185-
@ConditionalOnMissingBean(name = IntegrationContextUtils.TASK_SCHEDULER_BEAN_NAME)
186-
protected static class IntegrationTaskSchedulerConfiguration {
187-
188-
@Bean(name = IntegrationContextUtils.TASK_SCHEDULER_BEAN_NAME)
189-
@ConditionalOnBean(ThreadPoolTaskSchedulerBuilder.class)
190-
@ConditionalOnThreading(Threading.PLATFORM)
191-
ThreadPoolTaskScheduler taskScheduler(ThreadPoolTaskSchedulerBuilder threadPoolTaskSchedulerBuilder) {
192-
return threadPoolTaskSchedulerBuilder.build();
193-
}
194-
195-
@Bean(name = IntegrationContextUtils.TASK_SCHEDULER_BEAN_NAME)
196-
@ConditionalOnBean(SimpleAsyncTaskSchedulerBuilder.class)
197-
@ConditionalOnThreading(Threading.VIRTUAL)
198-
SimpleAsyncTaskScheduler taskSchedulerVirtualThreads(
199-
SimpleAsyncTaskSchedulerBuilder simpleAsyncTaskSchedulerBuilder) {
200-
return simpleAsyncTaskSchedulerBuilder.build();
201-
}
202-
203-
}
204-
205173
/**
206174
* Spring Integration JMX configuration.
207175
*/

0 commit comments

Comments
 (0)