From dddfab9307aba0718a2f563e572447886da16953 Mon Sep 17 00:00:00 2001 From: Sandipan Date: Thu, 27 Nov 2025 22:48:39 +0530 Subject: [PATCH] Add support for context propagation in task execution Signed-off-by: Sandipan --- .../task/TaskExecutionProperties.java | 13 ++++++++ .../task/TaskExecutorConfigurations.java | 30 ++++++++++++++++--- 2 files changed, 39 insertions(+), 4 deletions(-) diff --git a/core/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/task/TaskExecutionProperties.java b/core/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/task/TaskExecutionProperties.java index 144fbb60e67..93eacc89c7f 100644 --- a/core/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/task/TaskExecutionProperties.java +++ b/core/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/task/TaskExecutionProperties.java @@ -44,6 +44,11 @@ public class TaskExecutionProperties { */ private Mode mode = Mode.AUTO; + /** + * Indicates whether to register ContextPropagatingTaskDecorator bean + */ + private boolean propagateContext = false; + /** * Prefix to use for the names of newly created threads. */ @@ -69,6 +74,14 @@ public class TaskExecutionProperties { this.mode = mode; } + public boolean getPropagateContext() { + return this.propagateContext; + } + + public void setPropagateContext(boolean propagateContext) { + this.propagateContext = propagateContext; + } + public String getThreadNamePrefix() { return this.threadNamePrefix; } diff --git a/core/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/task/TaskExecutorConfigurations.java b/core/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/task/TaskExecutorConfigurations.java index a519c65374a..e4819f21058 100644 --- a/core/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/task/TaskExecutorConfigurations.java +++ b/core/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/task/TaskExecutorConfigurations.java @@ -75,17 +75,39 @@ class TaskExecutorConfigurations { @Bean(TaskExecutionAutoConfiguration.APPLICATION_TASK_EXECUTOR_BEAN_NAME) @ConditionalOnThreading(Threading.VIRTUAL) - SimpleAsyncTaskExecutor applicationTaskExecutorVirtualThreads(SimpleAsyncTaskExecutorBuilder builder) { - return builder.build(); + SimpleAsyncTaskExecutor applicationTaskExecutorVirtualThreads(SimpleAsyncTaskExecutorBuilder builder, + ObjectProvider decorators) { + TaskDecorator decorator = decorators.getIfAvailable(); + SimpleAsyncTaskExecutor executor = builder.build(); + if (decorator != null) { + executor.setTaskDecorator(decorator); + } + return executor; } @Bean(TaskExecutionAutoConfiguration.APPLICATION_TASK_EXECUTOR_BEAN_NAME) @Lazy @ConditionalOnThreading(Threading.PLATFORM) - ThreadPoolTaskExecutor applicationTaskExecutor(ThreadPoolTaskExecutorBuilder threadPoolTaskExecutorBuilder) { - return threadPoolTaskExecutorBuilder.build(); + ThreadPoolTaskExecutor applicationTaskExecutor( ThreadPoolTaskExecutorBuilder threadPoolTaskExecutorBuilder, + ObjectProvider decorators ) { + TaskDecorator decorator = decorators.getIfAvailable(); + ThreadPoolTaskExecutor executor = builder.build(); + if (decorator != null) { + executor.setTaskDecorator(decorator); + } + return executor; } + @Bean + @ConditionalOnProperty( + prefix = "spring.task.execution", + name = "propagate-context", + havingValue = "true", + matchIfMissing = false + ) + TaskDecorator contextPropagatingTaskDecorator() { + return new ContextPropagatingTaskDecorator(); + } } @Configuration(proxyBeanMethods = false)