diff --git a/src/main/java/com/knecon/fforesight/tenantcommons/AsyncConfig.java b/src/main/java/com/knecon/fforesight/tenantcommons/AsyncConfig.java deleted file mode 100644 index 9414830..0000000 --- a/src/main/java/com/knecon/fforesight/tenantcommons/AsyncConfig.java +++ /dev/null @@ -1,29 +0,0 @@ -package com.knecon.fforesight.tenantcommons; - -import java.util.concurrent.Executor; - -import org.springframework.boot.autoconfigure.condition.ConditionalOnClass; -import org.springframework.context.annotation.Configuration; -import org.springframework.scheduling.annotation.AsyncConfigurerSupport; -import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor; - -@Configuration -@ConditionalOnClass(AsyncConfigurerSupport.class) -public class AsyncConfig extends AsyncConfigurerSupport { - - @Override - public Executor getAsyncExecutor() { - - ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor(); - - executor.setCorePoolSize(7); - executor.setMaxPoolSize(42); - executor.setQueueCapacity(11); - executor.setThreadNamePrefix("TenantAwareTaskExecutor-"); - executor.setTaskDecorator(new TenantAwareTaskDecorator()); - executor.initialize(); - - return executor; - } - -} diff --git a/src/main/java/com/knecon/fforesight/tenantcommons/TenantAwareTaskDecorator.java b/src/main/java/com/knecon/fforesight/tenantcommons/TenantAwareTaskDecorator.java index f182286..1a2b96e 100644 --- a/src/main/java/com/knecon/fforesight/tenantcommons/TenantAwareTaskDecorator.java +++ b/src/main/java/com/knecon/fforesight/tenantcommons/TenantAwareTaskDecorator.java @@ -1,9 +1,9 @@ package com.knecon.fforesight.tenantcommons; -import org.springframework.core.task.TaskDecorator; +import com.knecon.fforesight.tenantcommons.task.KneconTaskDecorator; import org.springframework.lang.NonNull; -public class TenantAwareTaskDecorator implements TaskDecorator { +public class TenantAwareTaskDecorator implements KneconTaskDecorator { @Override @NonNull diff --git a/src/main/java/com/knecon/fforesight/tenantcommons/task/KneconTaskDecorator.java b/src/main/java/com/knecon/fforesight/tenantcommons/task/KneconTaskDecorator.java new file mode 100644 index 0000000..f47d0c3 --- /dev/null +++ b/src/main/java/com/knecon/fforesight/tenantcommons/task/KneconTaskDecorator.java @@ -0,0 +1,7 @@ +package com.knecon.fforesight.tenantcommons.task; + +import org.springframework.core.task.TaskDecorator; + +// Marker interface +public interface KneconTaskDecorator extends TaskDecorator { +} diff --git a/src/main/java/com/knecon/fforesight/tenantcommons/task/TaskDecoratorConfiguration.java b/src/main/java/com/knecon/fforesight/tenantcommons/task/TaskDecoratorConfiguration.java new file mode 100644 index 0000000..b95a31e --- /dev/null +++ b/src/main/java/com/knecon/fforesight/tenantcommons/task/TaskDecoratorConfiguration.java @@ -0,0 +1,17 @@ +package com.knecon.fforesight.tenantcommons.task; + +import com.knecon.fforesight.tenantcommons.TenantAwareTaskDecorator; +import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; + +@Configuration(proxyBeanMethods = false) +public class TaskDecoratorConfiguration { + + @Bean + @ConditionalOnMissingBean + public KneconTaskDecorator tenantAwareTaskDecorator() { + + return new TenantAwareTaskDecorator(); + } +} diff --git a/src/main/java/com/knecon/fforesight/tenantcommons/task/TaskExecutionConfiguration.java b/src/main/java/com/knecon/fforesight/tenantcommons/task/TaskExecutionConfiguration.java new file mode 100644 index 0000000..7902c5e --- /dev/null +++ b/src/main/java/com/knecon/fforesight/tenantcommons/task/TaskExecutionConfiguration.java @@ -0,0 +1,11 @@ +package com.knecon.fforesight.tenantcommons.task; + +import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty; +import org.springframework.context.annotation.Configuration; +import org.springframework.context.annotation.PropertySource; + +@Configuration(proxyBeanMethods = false) +@PropertySource("classpath:tenant-commons-task.properties") +@ConditionalOnProperty(prefix = "management.tracing", name = "enabled", havingValue = "false") +public class TaskExecutionConfiguration { +} diff --git a/src/main/resources/tenant-commons-task.properties b/src/main/resources/tenant-commons-task.properties new file mode 100644 index 0000000..53bc191 --- /dev/null +++ b/src/main/resources/tenant-commons-task.properties @@ -0,0 +1,10 @@ +# +# Configure task executor specs +# +# For more available props, +# see: https://github.com/spring-projects/spring-boot/blob/main/spring-boot-project/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/task/TaskExecutionProperties.java +# +spring.task.execution.pool.coreSize=7 +spring.task.execution.pool.maxSize=42 +spring.task.execution.pool.queueCapacity=11 +spring.task.execution.threadNamePrefix=TenantAwareTaskExecutor- diff --git a/src/test/java/com/knecon/fforesight/tenantcommons/TaskExecutionTest.java b/src/test/java/com/knecon/fforesight/tenantcommons/TaskExecutionTest.java new file mode 100644 index 0000000..999997e --- /dev/null +++ b/src/test/java/com/knecon/fforesight/tenantcommons/TaskExecutionTest.java @@ -0,0 +1,71 @@ +package com.knecon.fforesight.tenantcommons; + +import com.knecon.fforesight.tenantcommons.task.TaskDecoratorConfiguration; +import com.knecon.fforesight.tenantcommons.task.TaskExecutionConfiguration; +import lombok.extern.slf4j.Slf4j; +import lombok.val; +import org.junit.jupiter.api.Test; +import org.springframework.boot.autoconfigure.AutoConfigurations; +import org.springframework.boot.autoconfigure.task.TaskExecutionAutoConfiguration; +import org.springframework.boot.test.context.runner.ApplicationContextRunner; +import org.springframework.scheduling.annotation.AsyncAnnotationBeanPostProcessor; +import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor; + +import static org.assertj.core.api.AssertionsForClassTypes.assertThat; + +@Slf4j +public class TaskExecutionTest { + + private final ApplicationContextRunner contextRunner = new ApplicationContextRunner() + .withConfiguration(AutoConfigurations.of(TaskExecutionAutoConfiguration.class)) + .withUserConfiguration(TaskDecoratorConfiguration.class, TaskExecutionConfiguration.class); + + + @Test + public void taskAsyncWithTracingDisabledTest() { + + this.contextRunner + .withPropertyValues("management.tracing.enabled=false") + .run(context -> { + val taskExecutor = context.getBean(AsyncAnnotationBeanPostProcessor.DEFAULT_TASK_EXECUTOR_BEAN_NAME); + + assertThat(taskExecutor).isNotNull(); + assertThat(taskExecutor).isInstanceOf(ThreadPoolTaskExecutor.class); + if (taskExecutor instanceof ThreadPoolTaskExecutor threadPoolTaskExecutor) { + assertThat(threadPoolTaskExecutor.getCorePoolSize()).isEqualTo(7); + assertThat(threadPoolTaskExecutor.getMaxPoolSize()).isEqualTo(42); + assertThat(threadPoolTaskExecutor.getQueueCapacity()).isEqualTo(11); + assertThat(threadPoolTaskExecutor.getThreadNamePrefix()).isEqualTo("TenantAwareTaskExecutor-"); + } + }); + } + + + @Test + public void taskDecoratorWithTracingDisabledTest() { + + this.contextRunner + .withPropertyValues("management.tracing.enabled=false") + .run(context -> { + val tenantAwareTaskDecoratorBean = context.getBean("tenantAwareTaskDecorator"); + + assertThat(tenantAwareTaskDecoratorBean).isNotNull(); + assertThat(tenantAwareTaskDecoratorBean).isInstanceOf(TenantAwareTaskDecorator.class); + }); + } + + + @Test + public void taskDecoratorWithTracingEnabledTest() { + + this.contextRunner + .withPropertyValues("management.tracing.enabled=true") + .run(context -> { + val tenantAwareTaskDecoratorBean = context.getBean("tenantAwareTaskDecorator"); + + assertThat(tenantAwareTaskDecoratorBean).isNotNull(); + assertThat(tenantAwareTaskDecoratorBean).isInstanceOf(TenantAwareTaskDecorator.class); + }); + } + +}