RED-8171 : Refactored AsyncConfig to take into account tracing configuration overwrite

This commit is contained in:
Hanelore Ianoseck 2024-01-29 16:20:29 +01:00 committed by Timo Bejan
parent faf12716b6
commit 56e5092571
7 changed files with 118 additions and 31 deletions

View File

@ -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;
}
}

View File

@ -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

View File

@ -0,0 +1,7 @@
package com.knecon.fforesight.tenantcommons.task;
import org.springframework.core.task.TaskDecorator;
// Marker interface
public interface KneconTaskDecorator extends TaskDecorator {
}

View File

@ -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();
}
}

View File

@ -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 {
}

View File

@ -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-

View File

@ -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);
});
}
}