Spring Async получает текущего исполнителя

#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 для получения экземпляра в вашей службе.