#spring-boot #spring-async
#spring-загрузка #spring-асинхронный
Вопрос:
Я использую Spring Async
путем реализации AsyncConfigurer
и переопределения getAsyncExecutor
для определения моего Executor
. Теперь я хотел бы предоставить конечную точку, чтобы вернуть текущий размер очереди, количество потоков … и т.д. Исполнителя, который используется Async. Но я не смог найти способ найти или автоматически подключить текущего исполнителя, который используется Async. Я думал, что смогу определить компонент, который будет использоваться как getAsyncExecutor
методом, так и моей службой отчетов. Но мне было интересно, есть ли более простой / подходящий способ взаимодействия с async для получения текущего Executor
.
Моя текущая конфигурация:
@Configuration
@EnableAsync
public class AsyncConfiguration implements AsyncConfigurer {
@Override
public Executor getAsyncExecutor() {
final ThreadPoolTaskExecutor threadPoolTaskExecutor = new ThreadPoolTaskExecutor();
threadPoolTaskExecutor.setThreadNamePrefix("async-thread-");
threadPoolTaskExecutor.setCorePoolSize(2);
threadPoolTaskExecutor.setMaxPoolSize(2);
threadPoolTaskExecutor.setQueueCapacity(100);
threadPoolTaskExecutor.initialize();
return threadPoolTaskExecutor;
}
}
Комментарии:
1. почему бы не определить как bean. Это лучший и простой вариант.
2. Определите
ThreadPoolTaskExecutor
как компонент И вызовите этот метод изgetAsyncExecutor
метода.
Ответ №1:
Вы не зарегистрировали компонент для ThreadPoolTaskExector
.
@Configuration
@EnableAsync
public class AsyncConfiguration implements AsyncConfigurer {
@Override
public Executor getAsyncExecutor() {
return taskExecutor();
}
@Bean
public ThreadPoolTaskExecutor taskExecutor() {
ThreadPoolTaskExecutor threadPoolTaskExecutor = new ThreadPoolTaskExecutor();
threadPoolTaskExecutor.setThreadNamePrefix("async-thread-");
threadPoolTaskExecutor.setCorePoolSize(2);
threadPoolTaskExecutor.setMaxPoolSize(2);
threadPoolTaskExecutor.setQueueCapacity(100);
return threadPoolTaskExecutor;
}
}
Однако Spring Boot 2.1 уже предварительно настраивает TaskExecutor
для вас, который вы можете настроить через свойства. Затем вы можете удалить всю конфигурацию и использовать только @EnableAsync
в своей конфигурации.
spring.task.execution.pool.core-size=2
spring.task.execution.pool.max-size=2
spring.task.execution.pool.queue-capacity=100
spring.task.exection.thread-name-prefix=async-thread-
Эта конфигурация вместе с single @EnableAsync
обеспечит то же самое без дополнительной настройки.
Теперь вы можете использовать любую конфигурацию @Autowired
для получения экземпляра в вашей службе.