Skip to content

Commit 5fde792

Browse files
committed
Introduce configuration property key "spring.integration.poller.use-application-task-executor"
Fix spring-projectsGH-44534 Signed-off-by: Yanming Zhou <zhouyanming@gmail.com>
1 parent da5796f commit 5fde792

File tree

3 files changed

+40
-1
lines changed

3 files changed

+40
-1
lines changed

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

+10-1
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,8 @@
2424
import io.rsocket.transport.netty.server.TcpServerTransport;
2525

2626
import org.springframework.beans.factory.BeanFactory;
27+
import org.springframework.beans.factory.ObjectProvider;
28+
import org.springframework.beans.factory.annotation.Qualifier;
2729
import org.springframework.boot.autoconfigure.AutoConfiguration;
2830
import org.springframework.boot.autoconfigure.AutoConfigureBefore;
2931
import org.springframework.boot.autoconfigure.condition.AnyNestedCondition;
@@ -40,6 +42,7 @@
4042
import org.springframework.boot.autoconfigure.jmx.JmxProperties;
4143
import org.springframework.boot.autoconfigure.rsocket.RSocketMessagingAutoConfiguration;
4244
import org.springframework.boot.autoconfigure.sql.init.OnDatabaseInitializationCondition;
45+
import org.springframework.boot.autoconfigure.task.TaskExecutionAutoConfiguration;
4346
import org.springframework.boot.autoconfigure.task.TaskSchedulingAutoConfiguration;
4447
import org.springframework.boot.autoconfigure.thread.Threading;
4548
import org.springframework.boot.context.properties.EnableConfigurationProperties;
@@ -51,6 +54,7 @@
5154
import org.springframework.context.annotation.Conditional;
5255
import org.springframework.context.annotation.Configuration;
5356
import org.springframework.context.annotation.Import;
57+
import org.springframework.core.task.TaskExecutor;
5458
import org.springframework.integration.config.EnableIntegration;
5559
import org.springframework.integration.config.EnableIntegrationManagement;
5660
import org.springframework.integration.config.IntegrationComponentScanRegistrar;
@@ -85,6 +89,7 @@
8589
* @author Vedran Pavic
8690
* @author Madhura Bhave
8791
* @author Yong-Hyun Kim
92+
* @author Yanming Zhou
8893
* @since 1.1.0
8994
*/
9095
@AutoConfiguration(after = { DataSourceAutoConfiguration.class, JmxAutoConfiguration.class,
@@ -130,7 +135,8 @@ protected static class IntegrationConfiguration {
130135

131136
@Bean(PollerMetadata.DEFAULT_POLLER)
132137
@ConditionalOnMissingBean(name = PollerMetadata.DEFAULT_POLLER)
133-
public PollerMetadata defaultPollerMetadata(IntegrationProperties integrationProperties) {
138+
public PollerMetadata defaultPollerMetadata(IntegrationProperties integrationProperties,
139+
@Qualifier(TaskExecutionAutoConfiguration.APPLICATION_TASK_EXECUTOR_BEAN_NAME) ObjectProvider<TaskExecutor> taskExecutor) {
134140
IntegrationProperties.Poller poller = integrationProperties.getPoller();
135141
MutuallyExclusiveConfigurationPropertiesException.throwIfMultipleNonNullValuesIn((entries) -> {
136142
entries.put("spring.integration.poller.cron",
@@ -143,6 +149,9 @@ public PollerMetadata defaultPollerMetadata(IntegrationProperties integrationPro
143149
map.from(poller::getMaxMessagesPerPoll).to(pollerMetadata::setMaxMessagesPerPoll);
144150
map.from(poller::getReceiveTimeout).as(Duration::toMillis).to(pollerMetadata::setReceiveTimeout);
145151
map.from(poller).as(this::asTrigger).to(pollerMetadata::setTrigger);
152+
if (poller.isUseApplicationTaskExecutor()) {
153+
pollerMetadata.setTaskExecutor(taskExecutor.getObject());
154+
}
146155
return pollerMetadata;
147156
}
148157

spring-boot-project/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/integration/IntegrationProperties.java

+15
Original file line numberDiff line numberDiff line change
@@ -23,13 +23,15 @@
2323

2424
import org.springframework.boot.context.properties.ConfigurationProperties;
2525
import org.springframework.boot.sql.init.DatabaseInitializationMode;
26+
import org.springframework.core.task.TaskExecutor;
2627

2728
/**
2829
* Configuration properties for Spring Integration.
2930
*
3031
* @author Vedran Pavic
3132
* @author Stephane Nicoll
3233
* @author Artem Bilan
34+
* @author Yanming Zhou
3335
* @since 2.0.0
3436
*/
3537
@ConfigurationProperties("spring.integration")
@@ -369,6 +371,11 @@ public static class Poller {
369371
*/
370372
private String cron;
371373

374+
/**
375+
* Whether to use the application TaskExecutor for default poller.
376+
*/
377+
private boolean useApplicationTaskExecutor;
378+
372379
public int getMaxMessagesPerPoll() {
373380
return this.maxMessagesPerPoll;
374381
}
@@ -417,6 +424,14 @@ public void setCron(String cron) {
417424
this.cron = cron;
418425
}
419426

427+
public boolean isUseApplicationTaskExecutor() {
428+
return this.useApplicationTaskExecutor;
429+
}
430+
431+
public void setUseApplicationTaskExecutor(boolean useApplicationTaskExecutor) {
432+
this.useApplicationTaskExecutor = useApplicationTaskExecutor;
433+
}
434+
420435
}
421436

422437
public static class Management {

spring-boot-project/spring-boot-autoconfigure/src/test/java/org/springframework/boot/autoconfigure/integration/IntegrationAutoConfigurationTests.java

+15
Original file line numberDiff line numberDiff line change
@@ -50,6 +50,7 @@
5050
import org.springframework.boot.autoconfigure.rsocket.RSocketRequesterAutoConfiguration;
5151
import org.springframework.boot.autoconfigure.rsocket.RSocketServerAutoConfiguration;
5252
import org.springframework.boot.autoconfigure.rsocket.RSocketStrategiesAutoConfiguration;
53+
import org.springframework.boot.autoconfigure.task.TaskExecutionAutoConfiguration;
5354
import org.springframework.boot.autoconfigure.task.TaskSchedulingAutoConfiguration;
5455
import org.springframework.boot.context.properties.source.MutuallyExclusiveConfigurationPropertiesException;
5556
import org.springframework.boot.jdbc.init.DataSourceScriptDatabaseInitializer;
@@ -105,6 +106,7 @@
105106
* @author Stephane Nicoll
106107
* @author Vedran Pavic
107108
* @author Yong-Hyun Kim
109+
* @author Yanming Zhou
108110
*/
109111
class IntegrationAutoConfigurationTests {
110112

@@ -498,6 +500,19 @@ void whenFixedRatePollerPropertyIsSetThenItIsReflectedAsFixedRatePropertyOfPerio
498500
});
499501
}
500502

503+
@Test
504+
void useApplicationTaskExecutorWhenCorrespondingPollerPropertyAreSet() {
505+
this.contextRunner.withConfiguration(AutoConfigurations.of(TaskExecutionAutoConfiguration.class))
506+
.withUserConfiguration(PollingConsumerConfiguration.class)
507+
.withPropertyValues("spring.integration.poller.use-application-task-executor=true")
508+
.run((context) -> {
509+
assertThat(context).hasSingleBean(PollerMetadata.class);
510+
PollerMetadata metadata = context.getBean(PollerMetadata.DEFAULT_POLLER, PollerMetadata.class);
511+
assertThat(metadata.getTaskExecutor())
512+
.isSameAs(context.getBean(TaskExecutionAutoConfiguration.APPLICATION_TASK_EXECUTOR_BEAN_NAME));
513+
});
514+
}
515+
501516
@Test
502517
void integrationManagementLoggingIsEnabledByDefault() {
503518
this.contextRunner.withBean(DirectChannel.class, DirectChannel::new)

0 commit comments

Comments
 (0)