|
32 | 32 | import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
|
33 | 33 | import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
|
34 | 34 | import org.springframework.boot.autoconfigure.condition.ConditionalOnSingleCandidate;
|
| 35 | +import org.springframework.boot.autoconfigure.condition.ConditionalOnThreading; |
35 | 36 | import org.springframework.boot.autoconfigure.condition.SearchStrategy;
|
36 | 37 | import org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration;
|
37 | 38 | import org.springframework.boot.autoconfigure.jmx.JmxAutoConfiguration;
|
38 | 39 | import org.springframework.boot.autoconfigure.jmx.JmxProperties;
|
39 | 40 | import org.springframework.boot.autoconfigure.rsocket.RSocketMessagingAutoConfiguration;
|
40 | 41 | import org.springframework.boot.autoconfigure.sql.init.OnDatabaseInitializationCondition;
|
41 | 42 | import org.springframework.boot.autoconfigure.task.TaskSchedulingAutoConfiguration;
|
| 43 | +import org.springframework.boot.autoconfigure.thread.Threading; |
42 | 44 | import org.springframework.boot.context.properties.EnableConfigurationProperties;
|
43 | 45 | import org.springframework.boot.context.properties.PropertyMapper;
|
44 | 46 | import org.springframework.boot.context.properties.source.MutuallyExclusiveConfigurationPropertiesException;
|
| 47 | +import org.springframework.boot.task.SimpleAsyncTaskSchedulerBuilder; |
45 | 48 | import org.springframework.boot.task.ThreadPoolTaskSchedulerBuilder;
|
46 | 49 | import org.springframework.context.annotation.Bean;
|
47 | 50 | import org.springframework.context.annotation.Conditional;
|
|
65 | 68 | import org.springframework.messaging.rsocket.RSocketStrategies;
|
66 | 69 | import org.springframework.messaging.rsocket.annotation.support.RSocketMessageHandler;
|
67 | 70 | import org.springframework.scheduling.Trigger;
|
| 71 | +import org.springframework.scheduling.concurrent.SimpleAsyncTaskScheduler; |
68 | 72 | import org.springframework.scheduling.concurrent.ThreadPoolTaskScheduler;
|
69 | 73 | import org.springframework.scheduling.support.CronTrigger;
|
70 | 74 | import org.springframework.scheduling.support.PeriodicTrigger;
|
|
79 | 83 | * @author Stephane Nicoll
|
80 | 84 | * @author Vedran Pavic
|
81 | 85 | * @author Madhura Bhave
|
| 86 | + * @author Yong-Hyun Kim |
82 | 87 | * @since 1.1.0
|
83 | 88 | */
|
84 | 89 | @AutoConfiguration(after = { DataSourceAutoConfiguration.class, JmxAutoConfiguration.class,
|
@@ -165,19 +170,31 @@ private Trigger createPeriodicTrigger(Duration period, Duration initialDelay, bo
|
165 | 170 | }
|
166 | 171 |
|
167 | 172 | /**
|
168 |
| - * Expose a standard {@link ThreadPoolTaskScheduler} if the user has not enabled task |
169 |
| - * scheduling explicitly. |
| 173 | + * Expose a standard {@link org.springframework.scheduling.TaskScheduler |
| 174 | + * TaskScheduler} if the user has not enabled task scheduling explicitly. A |
| 175 | + * {@link SimpleAsyncTaskScheduler} is exposed if the user enables virtual threads via |
| 176 | + * {@code spring.threads.virtual.enabled=true}, otherwise |
| 177 | + * {@link ThreadPoolTaskScheduler}. |
170 | 178 | */
|
171 | 179 | @Configuration(proxyBeanMethods = false)
|
172 |
| - @ConditionalOnBean(ThreadPoolTaskSchedulerBuilder.class) |
173 | 180 | @ConditionalOnMissingBean(name = IntegrationContextUtils.TASK_SCHEDULER_BEAN_NAME)
|
174 | 181 | protected static class IntegrationTaskSchedulerConfiguration {
|
175 | 182 |
|
176 | 183 | @Bean(name = IntegrationContextUtils.TASK_SCHEDULER_BEAN_NAME)
|
| 184 | + @ConditionalOnBean(ThreadPoolTaskSchedulerBuilder.class) |
| 185 | + @ConditionalOnThreading(Threading.PLATFORM) |
177 | 186 | public ThreadPoolTaskScheduler taskScheduler(ThreadPoolTaskSchedulerBuilder threadPoolTaskSchedulerBuilder) {
|
178 | 187 | return threadPoolTaskSchedulerBuilder.build();
|
179 | 188 | }
|
180 | 189 |
|
| 190 | + @Bean(name = IntegrationContextUtils.TASK_SCHEDULER_BEAN_NAME) |
| 191 | + @ConditionalOnBean(SimpleAsyncTaskSchedulerBuilder.class) |
| 192 | + @ConditionalOnThreading(Threading.VIRTUAL) |
| 193 | + public SimpleAsyncTaskScheduler taskSchedulerVirtualThreads( |
| 194 | + SimpleAsyncTaskSchedulerBuilder simpleAsyncTaskSchedulerBuilder) { |
| 195 | + return simpleAsyncTaskSchedulerBuilder.build(); |
| 196 | + } |
| 197 | + |
181 | 198 | }
|
182 | 199 |
|
183 | 200 | /**
|
|
0 commit comments