Polish "Make Scheduler consistent for Spring Integration"
See gh-25109
This commit is contained in:
parent
c5491cfdd7
commit
dca643500a
|
@ -46,6 +46,7 @@ import org.springframework.core.io.ResourceLoader;
|
||||||
import org.springframework.integration.config.EnableIntegration;
|
import org.springframework.integration.config.EnableIntegration;
|
||||||
import org.springframework.integration.config.EnableIntegrationManagement;
|
import org.springframework.integration.config.EnableIntegrationManagement;
|
||||||
import org.springframework.integration.config.IntegrationManagementConfigurer;
|
import org.springframework.integration.config.IntegrationManagementConfigurer;
|
||||||
|
import org.springframework.integration.context.IntegrationContextUtils;
|
||||||
import org.springframework.integration.gateway.GatewayProxyFactoryBean;
|
import org.springframework.integration.gateway.GatewayProxyFactoryBean;
|
||||||
import org.springframework.integration.jdbc.store.JdbcMessageStore;
|
import org.springframework.integration.jdbc.store.JdbcMessageStore;
|
||||||
import org.springframework.integration.jmx.config.EnableIntegrationMBeanExport;
|
import org.springframework.integration.jmx.config.EnableIntegrationMBeanExport;
|
||||||
|
@ -58,7 +59,6 @@ import org.springframework.integration.rsocket.outbound.RSocketOutboundGateway;
|
||||||
import org.springframework.messaging.rsocket.RSocketRequester;
|
import org.springframework.messaging.rsocket.RSocketRequester;
|
||||||
import org.springframework.messaging.rsocket.RSocketStrategies;
|
import org.springframework.messaging.rsocket.RSocketStrategies;
|
||||||
import org.springframework.messaging.rsocket.annotation.support.RSocketMessageHandler;
|
import org.springframework.messaging.rsocket.annotation.support.RSocketMessageHandler;
|
||||||
import org.springframework.scheduling.TaskScheduler;
|
|
||||||
import org.springframework.scheduling.concurrent.ThreadPoolTaskScheduler;
|
import org.springframework.scheduling.concurrent.ThreadPoolTaskScheduler;
|
||||||
import org.springframework.util.StringUtils;
|
import org.springframework.util.StringUtils;
|
||||||
|
|
||||||
|
@ -80,21 +80,6 @@ import org.springframework.util.StringUtils;
|
||||||
TaskSchedulingAutoConfiguration.class })
|
TaskSchedulingAutoConfiguration.class })
|
||||||
public class IntegrationAutoConfiguration {
|
public class IntegrationAutoConfiguration {
|
||||||
|
|
||||||
/**
|
|
||||||
* The {@link TaskScheduler} configuration.
|
|
||||||
*/
|
|
||||||
@Configuration(proxyBeanMethods = false)
|
|
||||||
@ConditionalOnBean(TaskSchedulerBuilder.class)
|
|
||||||
protected static class IntegrationTaskSchedulerConfiguration {
|
|
||||||
|
|
||||||
@Bean
|
|
||||||
@ConditionalOnMissingBean
|
|
||||||
public ThreadPoolTaskScheduler taskScheduler(TaskSchedulerBuilder builder) {
|
|
||||||
return builder.build();
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Basic Spring Integration configuration.
|
* Basic Spring Integration configuration.
|
||||||
*/
|
*/
|
||||||
|
@ -104,6 +89,22 @@ public class IntegrationAutoConfiguration {
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Expose a standard {@link ThreadPoolTaskScheduler} if the user has not enabled task
|
||||||
|
* scheduling explicitly.
|
||||||
|
*/
|
||||||
|
@Configuration(proxyBeanMethods = false)
|
||||||
|
@ConditionalOnBean(TaskSchedulerBuilder.class)
|
||||||
|
@ConditionalOnMissingBean(name = IntegrationContextUtils.TASK_SCHEDULER_BEAN_NAME)
|
||||||
|
protected static class IntegrationTaskSchedulerConfiguration {
|
||||||
|
|
||||||
|
@Bean(name = IntegrationContextUtils.TASK_SCHEDULER_BEAN_NAME)
|
||||||
|
public ThreadPoolTaskScheduler taskScheduler(TaskSchedulerBuilder builder) {
|
||||||
|
return builder.build();
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Spring Integration JMX configuration.
|
* Spring Integration JMX configuration.
|
||||||
*/
|
*/
|
||||||
|
|
|
@ -74,8 +74,7 @@ import static org.mockito.Mockito.mock;
|
||||||
class IntegrationAutoConfigurationTests {
|
class IntegrationAutoConfigurationTests {
|
||||||
|
|
||||||
private final ApplicationContextRunner contextRunner = new ApplicationContextRunner()
|
private final ApplicationContextRunner contextRunner = new ApplicationContextRunner()
|
||||||
.withConfiguration(AutoConfigurations.of(JmxAutoConfiguration.class, IntegrationAutoConfiguration.class,
|
.withConfiguration(AutoConfigurations.of(JmxAutoConfiguration.class, IntegrationAutoConfiguration.class));
|
||||||
TaskSchedulingAutoConfiguration.class));
|
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
void integrationIsAvailable() {
|
void integrationIsAvailable() {
|
||||||
|
@ -226,14 +225,29 @@ class IntegrationAutoConfigurationTests {
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
void taskSchedulerAutoConfigured() {
|
void taskSchedulerIsNotOverridden() {
|
||||||
this.contextRunner
|
this.contextRunner.withConfiguration(AutoConfigurations.of(TaskSchedulingAutoConfiguration.class))
|
||||||
.withPropertyValues("spring.task.scheduling.thread-name-prefix=integration-scheduling-",
|
.withPropertyValues("spring.task.scheduling.thread-name-prefix=integration-scheduling-",
|
||||||
"spring.task.scheduling.pool.size=3")
|
"spring.task.scheduling.pool.size=3")
|
||||||
.run((context) -> assertThat(context)
|
.run((context) -> {
|
||||||
.getBean(IntegrationContextUtils.TASK_SCHEDULER_BEAN_NAME, TaskScheduler.class)
|
assertThat(context).hasSingleBean(TaskScheduler.class);
|
||||||
.hasFieldOrPropertyWithValue("threadNamePrefix", "integration-scheduling-")
|
assertThat(context).getBean(IntegrationContextUtils.TASK_SCHEDULER_BEAN_NAME, TaskScheduler.class)
|
||||||
.hasFieldOrPropertyWithValue("scheduledExecutor.corePoolSize", 3));
|
.hasFieldOrPropertyWithValue("threadNamePrefix", "integration-scheduling-")
|
||||||
|
.hasFieldOrPropertyWithValue("scheduledExecutor.corePoolSize", 3);
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
void taskSchedulerCanBeCustomized() {
|
||||||
|
TaskScheduler customTaskScheduler = mock(TaskScheduler.class);
|
||||||
|
this.contextRunner.withConfiguration(AutoConfigurations.of(TaskSchedulingAutoConfiguration.class))
|
||||||
|
.withBean(IntegrationContextUtils.TASK_SCHEDULER_BEAN_NAME, TaskScheduler.class,
|
||||||
|
() -> customTaskScheduler)
|
||||||
|
.run((context) -> {
|
||||||
|
assertThat(context).hasSingleBean(TaskScheduler.class);
|
||||||
|
assertThat(context).getBean(IntegrationContextUtils.TASK_SCHEDULER_BEAN_NAME)
|
||||||
|
.isSameAs(customTaskScheduler);
|
||||||
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
@Configuration(proxyBeanMethods = false)
|
@Configuration(proxyBeanMethods = false)
|
||||||
|
|
|
@ -6249,7 +6249,7 @@ The auto-configured `TaskExecutorBuilder` allows you to easily create instances
|
||||||
====
|
====
|
||||||
|
|
||||||
The thread pool uses 8 core threads that can grow and shrink according to the load.
|
The thread pool uses 8 core threads that can grow and shrink according to the load.
|
||||||
Those default settings can be fine-tuned using the `spring.task.execution` namespace as shown in the following example:
|
Those default settings can be fine-tuned using the `spring.task.execution` namespace, as shown in the following example:
|
||||||
|
|
||||||
[source,yaml,indent=0,configprops,configblocks]
|
[source,yaml,indent=0,configprops,configblocks]
|
||||||
----
|
----
|
||||||
|
@ -6265,8 +6265,18 @@ Those default settings can be fine-tuned using the `spring.task.execution` names
|
||||||
This changes the thread pool to use a bounded queue so that when the queue is full (100 tasks), the thread pool increases to maximum 16 threads.
|
This changes the thread pool to use a bounded queue so that when the queue is full (100 tasks), the thread pool increases to maximum 16 threads.
|
||||||
Shrinking of the pool is more aggressive as threads are reclaimed when they are idle for 10 seconds (rather than 60 seconds by default).
|
Shrinking of the pool is more aggressive as threads are reclaimed when they are idle for 10 seconds (rather than 60 seconds by default).
|
||||||
|
|
||||||
A `ThreadPoolTaskScheduler` can also be auto-configured if need to be associated to scheduled task execution (`@EnableScheduling`).
|
A `ThreadPoolTaskScheduler` can also be auto-configured if need to be associated to scheduled task execution (e.g. `@EnableScheduling`).
|
||||||
The thread pool uses one thread by default and those settings can be fine-tuned using the `spring.task.scheduling` namespace.
|
The thread pool uses one thread by default and its settings can be fine-tuned using the `spring.task.scheduling` namespace, as shown in the following example:
|
||||||
|
|
||||||
|
[source,yaml,indent=0,configprops,configblocks]
|
||||||
|
----
|
||||||
|
spring:
|
||||||
|
task:
|
||||||
|
scheduling:
|
||||||
|
thread-name-prefix: "scheduling-"
|
||||||
|
pool:
|
||||||
|
size: 2
|
||||||
|
----
|
||||||
|
|
||||||
Both a `TaskExecutorBuilder` bean and a `TaskSchedulerBuilder` bean are made available in the context if a custom executor or scheduler needs to be created.
|
Both a `TaskExecutorBuilder` bean and a `TaskSchedulerBuilder` bean are made available in the context if a custom executor or scheduler needs to be created.
|
||||||
|
|
||||||
|
@ -6278,9 +6288,7 @@ Spring Boot offers several conveniences for working with {spring-integration}[Sp
|
||||||
Spring Integration provides abstractions over messaging and also other transports such as HTTP, TCP, and others.
|
Spring Integration provides abstractions over messaging and also other transports such as HTTP, TCP, and others.
|
||||||
If Spring Integration is available on your classpath, it is initialized through the `@EnableIntegration` annotation.
|
If Spring Integration is available on your classpath, it is initialized through the `@EnableIntegration` annotation.
|
||||||
|
|
||||||
Spring Integration polling logic is based on the `TaskScheduler`.
|
Spring Integration polling logic relies <<boot-features-task-execution-scheduling,on the auto-configured `TaskScheduler`>>.
|
||||||
So, it relies on the auto-configured one (see the previous section), or exposes a `taskScheduler` bean according provided `spring.task.scheduling` configuration properties.
|
|
||||||
If only Spring Integration is used, the `@EnableScheduling` annotation is optional and can be omitted on the target configuration classes.
|
|
||||||
|
|
||||||
Spring Boot also configures some features that are triggered by the presence of additional Spring Integration modules.
|
Spring Boot also configures some features that are triggered by the presence of additional Spring Integration modules.
|
||||||
If `spring-integration-jmx` is also on the classpath, message processing statistics are published over JMX.
|
If `spring-integration-jmx` is also on the classpath, message processing statistics are published over JMX.
|
||||||
|
|
Loading…
Reference in New Issue