Spring Websocket TaskExecutor-beans заменяет "applicationTaskExecutor" -bean - PullRequest
0 голосов
/ 07 октября 2019

У меня есть приложение Spring Boot 2.1.8, которое использует @Async -Задания. Все задачи @Async выполнялись автоматически настроенным ThreadPoolTaskExecutor бином с именем applicationTaskExecutor.

Что я изменил? С spring-boot-starter-websocket в пути к классам ив конфигурации @EnableWebSocketMessageBroker applicationTaskExecutor-фас исчезает и заменяется четырьмя бобами с именами

  • clientInboundChannelExecutor,
  • clientOutboundChannelExecutor,
  • brokerChannelExecutor,
  • и messageBrokerTaskScheduler.

Журналы Spring для консоли: AnnotationAsyncExecutionInterceptor : More than one TaskExecutor bean found within the context, and none is named 'taskExecutor'. Mark one of them as primary or name it 'taskExecutor' (possibly as an alias) in order to use it for async processing: [clientInboundChannelExecutor, clientOutboundChannelExecutor, brokerChannelExecutor, messageBrokerTaskScheduler]

@Async -задачи теперь выполняются SimpleAsyncTaskExecutor.

Вопрос Почему не все бобы могут сосуществовать? Почему Spring не создает applicationTaskExecutor -bean при настройке spring-websockets?

1 Ответ

0 голосов
/ 07 октября 2019

как @M. Deinum, упомянутый в комментариях a @ConditionalOnMissingBean in TaskExecutionAutoConfiguration.java [0], приводит к описанному поведению

Я решил это, создав боб самостоятельно.

@ConditionalOnClass(ThreadPoolTaskExecutor.class)
@Configuration
public class ApplicationTaskExecutorBeanConfig {

    @Lazy
    @Bean(name = {APPLICATION_TASK_EXECUTOR_BEAN_NAME, DEFAULT_TASK_EXECUTOR_BEAN_NAME})
    public ThreadPoolTaskExecutor applicationTaskExecutor(TaskExecutorBuilder builder) {
        return builder.build();
    }

}

Сначала я попыталсяЯ предпочитаю bean-компонент из TaskExecutionAutoConfiguration.java, аннотируя мой метод фабрики bean-компонентов с помощью

@ConditionalOnMissingBean(name = {APPLICATION_TASK_EXECUTOR_BEAN_NAME, DEFAULT_TASK_EXECUTOR_BEAN_NAME})

, но он не сработал, потому что мой метод фабрики bean-компонентов вызывается раньше, чем метод из TaskExecutionAutoConfiguration.java.

[0] https://github.com/spring-projects/spring-boot/blob/master/spring-boot-project/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/task/TaskExecutionAutoConfiguration.java#L78

Благодаря @M. Deinum за ваш комментарий.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...