Add TaskDecorator support for scheduled tasks
See gh-43190
This commit is contained in:
committed by
Stéphane Nicoll
parent
751afe2245
commit
f0c5312141
@@ -29,6 +29,7 @@ import org.springframework.boot.task.ThreadPoolTaskSchedulerBuilder;
|
||||
import org.springframework.boot.task.ThreadPoolTaskSchedulerCustomizer;
|
||||
import org.springframework.context.annotation.Bean;
|
||||
import org.springframework.context.annotation.Configuration;
|
||||
import org.springframework.core.task.TaskDecorator;
|
||||
import org.springframework.scheduling.TaskScheduler;
|
||||
import org.springframework.scheduling.concurrent.SimpleAsyncTaskScheduler;
|
||||
import org.springframework.scheduling.concurrent.ThreadPoolTaskScheduler;
|
||||
@@ -67,7 +68,8 @@ class TaskSchedulingConfigurations {
|
||||
@Bean
|
||||
@ConditionalOnMissingBean
|
||||
ThreadPoolTaskSchedulerBuilder threadPoolTaskSchedulerBuilder(TaskSchedulingProperties properties,
|
||||
ObjectProvider<ThreadPoolTaskSchedulerCustomizer> threadPoolTaskSchedulerCustomizers) {
|
||||
ObjectProvider<ThreadPoolTaskSchedulerCustomizer> threadPoolTaskSchedulerCustomizers,
|
||||
ObjectProvider<TaskDecorator> taskDecorator) {
|
||||
TaskSchedulingProperties.Shutdown shutdown = properties.getShutdown();
|
||||
ThreadPoolTaskSchedulerBuilder builder = new ThreadPoolTaskSchedulerBuilder();
|
||||
builder = builder.poolSize(properties.getPool().getSize());
|
||||
@@ -75,6 +77,7 @@ class TaskSchedulingConfigurations {
|
||||
builder = builder.awaitTerminationPeriod(shutdown.getAwaitTerminationPeriod());
|
||||
builder = builder.threadNamePrefix(properties.getThreadNamePrefix());
|
||||
builder = builder.customizers(threadPoolTaskSchedulerCustomizers);
|
||||
builder = builder.taskDecorator(taskDecorator.getIfUnique());
|
||||
return builder;
|
||||
}
|
||||
|
||||
@@ -87,10 +90,14 @@ class TaskSchedulingConfigurations {
|
||||
|
||||
private final ObjectProvider<SimpleAsyncTaskSchedulerCustomizer> taskSchedulerCustomizers;
|
||||
|
||||
private final ObjectProvider<TaskDecorator> taskDecorator;
|
||||
|
||||
SimpleAsyncTaskSchedulerBuilderConfiguration(TaskSchedulingProperties properties,
|
||||
ObjectProvider<SimpleAsyncTaskSchedulerCustomizer> taskSchedulerCustomizers) {
|
||||
ObjectProvider<SimpleAsyncTaskSchedulerCustomizer> taskSchedulerCustomizers,
|
||||
ObjectProvider<TaskDecorator> taskDecorator) {
|
||||
this.properties = properties;
|
||||
this.taskSchedulerCustomizers = taskSchedulerCustomizers;
|
||||
this.taskDecorator = taskDecorator;
|
||||
}
|
||||
|
||||
@Bean
|
||||
@@ -117,6 +124,7 @@ class TaskSchedulingConfigurations {
|
||||
if (shutdown.isAwaitTermination()) {
|
||||
builder = builder.taskTerminationTimeout(shutdown.getAwaitTerminationPeriod());
|
||||
}
|
||||
builder = builder.taskDecorator(this.taskDecorator.getIfUnique());
|
||||
return builder;
|
||||
}
|
||||
|
||||
|
||||
@@ -41,6 +41,7 @@ import org.springframework.boot.task.ThreadPoolTaskSchedulerCustomizer;
|
||||
import org.springframework.boot.test.context.runner.ApplicationContextRunner;
|
||||
import org.springframework.context.annotation.Bean;
|
||||
import org.springframework.context.annotation.Configuration;
|
||||
import org.springframework.core.task.TaskDecorator;
|
||||
import org.springframework.core.task.TaskExecutor;
|
||||
import org.springframework.scheduling.TaskScheduler;
|
||||
import org.springframework.scheduling.annotation.EnableScheduling;
|
||||
@@ -50,6 +51,7 @@ import org.springframework.scheduling.concurrent.ThreadPoolTaskScheduler;
|
||||
import org.springframework.scheduling.config.ScheduledTaskRegistrar;
|
||||
|
||||
import static org.assertj.core.api.Assertions.assertThat;
|
||||
import static org.mockito.Mockito.mock;
|
||||
|
||||
/**
|
||||
* Tests for {@link TaskSchedulingAutoConfiguration}.
|
||||
@@ -154,6 +156,30 @@ class TaskSchedulingAutoConfigurationTests {
|
||||
});
|
||||
}
|
||||
|
||||
@Test
|
||||
void simpleAsyncTaskSchedulerBuilderShouldApplyTaskDecorator() {
|
||||
this.contextRunner.withUserConfiguration(SchedulingConfiguration.class, TaskDecoratorConfig.class)
|
||||
.run((context) -> {
|
||||
assertThat(context).hasSingleBean(SimpleAsyncTaskSchedulerBuilder.class);
|
||||
assertThat(context).hasSingleBean(TaskDecorator.class);
|
||||
TaskDecorator taskDecorator = context.getBean(TaskDecorator.class);
|
||||
SimpleAsyncTaskSchedulerBuilder builder = context.getBean(SimpleAsyncTaskSchedulerBuilder.class);
|
||||
assertThat(builder).extracting("taskDecorator").isSameAs(taskDecorator);
|
||||
});
|
||||
}
|
||||
|
||||
@Test
|
||||
void threadPoolTaskSchedulerBuilderShouldApplyTaskDecorator() {
|
||||
this.contextRunner.withUserConfiguration(SchedulingConfiguration.class, TaskDecoratorConfig.class)
|
||||
.run((context) -> {
|
||||
assertThat(context).hasSingleBean(ThreadPoolTaskSchedulerBuilder.class);
|
||||
assertThat(context).hasSingleBean(TaskDecorator.class);
|
||||
TaskDecorator taskDecorator = context.getBean(TaskDecorator.class);
|
||||
ThreadPoolTaskSchedulerBuilder builder = context.getBean(ThreadPoolTaskSchedulerBuilder.class);
|
||||
assertThat(builder).extracting("taskDecorator").isSameAs(taskDecorator);
|
||||
});
|
||||
}
|
||||
|
||||
@Test
|
||||
void enableSchedulingWithNoTaskExecutorAppliesCustomizers() {
|
||||
this.contextRunner.withPropertyValues("spring.task.scheduling.thread-name-prefix=scheduling-test-")
|
||||
@@ -305,4 +331,14 @@ class TaskSchedulingAutoConfigurationTests {
|
||||
|
||||
}
|
||||
|
||||
@Configuration(proxyBeanMethods = false)
|
||||
static class TaskDecoratorConfig {
|
||||
|
||||
@Bean
|
||||
TaskDecorator mockTaskDecorator() {
|
||||
return mock(TaskDecorator.class);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user