diff --git a/components-starter/camel-platform-http-starter/src/main/java/org/apache/camel/component/platform/http/springboot/SpringBootPlatformHttpAutoConfiguration.java b/components-starter/camel-platform-http-starter/src/main/java/org/apache/camel/component/platform/http/springboot/SpringBootPlatformHttpAutoConfiguration.java index 17220e4cfd2..45ebab49c3d 100644 --- a/components-starter/camel-platform-http-starter/src/main/java/org/apache/camel/component/platform/http/springboot/SpringBootPlatformHttpAutoConfiguration.java +++ b/components-starter/camel-platform-http-starter/src/main/java/org/apache/camel/component/platform/http/springboot/SpringBootPlatformHttpAutoConfiguration.java @@ -26,7 +26,9 @@ import org.springframework.context.annotation.Configuration; import org.springframework.context.annotation.DependsOn; import org.springframework.core.env.Environment; +import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor; +import java.util.List; import java.util.concurrent.Executor; @Configuration(proxyBeanMethods = false) @@ -38,11 +40,21 @@ public class SpringBootPlatformHttpAutoConfiguration { CamelContext camelContext; @Autowired - Executor executor; + List executors; @Bean(name = "platform-http-engine") @ConditionalOnMissingBean(PlatformHttpEngine.class) public PlatformHttpEngine springBootPlatformHttpEngine(Environment env) { + Executor executor; + + if (executors != null && !executors.isEmpty()) { + executor = executors.stream() + .filter(e -> e instanceof ThreadPoolTaskExecutor) + .findFirst() + .orElseThrow(() -> new RuntimeException("No ThreadPoolTaskExecutor configured")); + } else { + throw new RuntimeException("No Executor configured"); + } int port = Integer.parseInt(env.getProperty("server.port", "8080")); return new SpringBootPlatformHttpEngine(port, executor); } diff --git a/components-starter/camel-platform-http-starter/src/test/java/org/apache/camel/component/platform/http/springboot/SpringBootPlatformHttpMultipleExecutorsTest.java b/components-starter/camel-platform-http-starter/src/test/java/org/apache/camel/component/platform/http/springboot/SpringBootPlatformHttpMultipleExecutorsTest.java new file mode 100644 index 00000000000..003afbae899 --- /dev/null +++ b/components-starter/camel-platform-http-starter/src/test/java/org/apache/camel/component/platform/http/springboot/SpringBootPlatformHttpMultipleExecutorsTest.java @@ -0,0 +1,86 @@ +package org.apache.camel.component.platform.http.springboot; + +import org.apache.camel.builder.RouteBuilder; +import org.apache.camel.spring.boot.CamelAutoConfiguration; +import org.apache.camel.test.spring.junit5.CamelSpringBootTest; +import org.assertj.core.api.Assertions; +import org.junit.jupiter.api.Test; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.autoconfigure.EnableAutoConfiguration; +import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.scheduling.annotation.EnableScheduling; +import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor; +import org.springframework.test.annotation.DirtiesContext; + +import java.util.List; +import java.util.concurrent.Executor; + +@EnableAutoConfiguration +@DirtiesContext(classMode = DirtiesContext.ClassMode.AFTER_EACH_TEST_METHOD) +@CamelSpringBootTest +@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT, classes = { CamelAutoConfiguration.class, + SpringBootPlatformHttpMultipleExecutorsTest.class, SpringBootPlatformHttpMultipleExecutorsTest.TestConfiguration.class, + PlatformHttpComponentAutoConfiguration.class, SpringBootPlatformHttpAutoConfiguration.class }) +@EnableScheduling +public class SpringBootPlatformHttpMultipleExecutorsTest extends PlatformHttpBase { + + private static final String postRouteId = "SpringBootPlatformHttpMultipleExecutorsTest_mypost"; + + private static final String getRouteId = "SpringBootPlatformHttpMultipleExecutorsTest_myget"; + + private static final String THREAD_PREFIX = "myThread-"; + + // ************************************* + // Config + // ************************************* + @Configuration + public static class TestConfiguration { + + @Bean(name = "customPoolTaskExecutor") + public Executor customPoolTaskExecutor() { + final ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor(); + executor.setCorePoolSize(2); + executor.setMaxPoolSize(2); + executor.setQueueCapacity(500); + executor.setThreadNamePrefix(THREAD_PREFIX); + executor.initialize(); + return executor; + } + + @Bean + public RouteBuilder servletPlatformHttpRouteBuilder() { + return new RouteBuilder() { + @Override + public void configure() { + from("platform-http:/myget").id(postRouteId).setBody().constant("get"); + from("platform-http:/mypost").id(getRouteId).transform().body(String.class, b -> b.toUpperCase()); + + from("platform-http:/executor").process(exchange -> exchange.getIn().setBody(Thread.currentThread().getName())); + } + }; + } + } + + @Override + protected String getPostRouteId() { + return postRouteId; + } + + @Override + protected String getGetRouteId() { + return getRouteId; + } + + @Autowired + List executors; + + @Test + public void checkCustomExecutorIsPickedWhenMultipleExecutorsAreDefined() { + Assertions.assertThat(executors).hasSizeGreaterThan(1); + + Assertions.assertThat(restTemplate.postForEntity("/executor", "test", String.class).getBody()) + .contains(THREAD_PREFIX); + } +}