@ConfigurationProperteis для кастомного/второго Spring Boot AsyncTaskExecutor

Вопрос или проблема

У меня есть приложение на Spring Boot, в котором я в настоящее время использую автоконфигурируемый AsyncTaskExecutor (в моем случае это будет ThreadPoolTaskExecutor).

Если позже мне потребуется исполнитель с отдельным/специальным пулом потоков в другом месте, существует ли эквивалентный вариант конфигурации как при конфигурировании второго/настраиваемого источника данных, который позволяет легко настраивать параметризацию через @ConfigurationProperties?

Ответ или решение

В вашем проекте Spring Boot, если вы хотите создать и настроить второй AsyncTaskExecutor с возможностью внешней настройки через аннотацию @ConfigurationProperties, то это можно сделать, следуя ряду шагов. В этой статье мы рассмотрим, как создать кастомный ThreadPoolTaskExecutor, используя @ConfigurationProperties, а также как правильно настроить Spring Boot для работы с несколькими асинхронными исполнителями.

Шаг 1: Создание класса конфигурации для AsyncTaskExecutor

Первым делом вам необходимо создать класс, который будет хранить настройки вашего второго AsyncTaskExecutor. Этот класс будет помечен аннотацией @ConfigurationProperties, чтобы Spring Boot мог автоматически связываать свойства из вашего application.properties или application.yml.

import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor;

@Configuration
@ConfigurationProperties(prefix = "custom.async")
public class CustomAsyncTaskExecutorConfig {

    private int corePoolSize;
    private int maxPoolSize;
    private int queueCapacity;

    // Геттеры и сеттеры

    @Bean(name = "customTaskExecutor")
    public ThreadPoolTaskExecutor customTaskExecutor() {
        ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor();
        executor.setCorePoolSize(corePoolSize);
        executor.setMaxPoolSize(maxPoolSize);
        executor.setQueueCapacity(queueCapacity);
        executor.initialize();
        return executor;
    }
}

Шаг 2: Настройка свойств в application.properties или application.yml

После того как вы создали конфигурационный класс, вам нужно определить свойства, которые будут использоваться для настройки вашего кастомного пула потоков. Эти свойства можно задать в вашем application.properties или application.yml следующим образом.

Пример для application.properties:

custom.async.core-pool-size=5
custom.async.max-pool-size=10
custom.async.queue-capacity=50

Пример для application.yml:

custom:
  async:
    core-pool-size: 5
    max-pool-size: 10
    queue-capacity: 50

Шаг 3: Использование кастомного AsyncTaskExecutor

Теперь, когда вы настроили кастомный AsyncTaskExecutor, вы можете использовать его в своих сервисах или контроллерах. Сделать это можно следующим образом:

import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.scheduling.annotation.Async;
import org.springframework.scheduling.annotation.EnableAsync;
import org.springframework.stereotype.Service;

@Service
@EnableAsync
public class MyService {

    private final ThreadPoolTaskExecutor customTaskExecutor;

    public MyService(@Qualifier("customTaskExecutor") ThreadPoolTaskExecutor customTaskExecutor) {
        this.customTaskExecutor = customTaskExecutor;
    }

    @Async("customTaskExecutor")
    public void executeAsyncTask() {
        // Ваша логика выполнения задачи
    }
}

Заключение

С помощью описанных шагов вы сможете с легкостью создать и сконфигурировать второй AsyncTaskExecutor в вашем приложении Spring Boot. Использование @ConfigurationProperties позволяет вам легко сохранять настройки и изменять их при необходимости, не внося изменений в код. Это подходит для случаев, когда вам требуется использовать несколько исполнителей для различных задач в вашем приложении.

Следуя этим шагам, вы можете обеспечить гибкость и мощность вашего приложения, эффективно управляя асинхронными задачами и распараллеливая выполнение.

Оцените материал
Добавить комментарий

Капча загружается...