Как правильно добавить код инициализации в приложение Spring Boot? - PullRequest
1 голос
/ 18 октября 2019

TLDR: я хочу, чтобы мое приложение Spring Boot запускало некоторый код инициализации при запуске. Код должен иметь доступ к bean-компонентам и значениям Spring.

Я пишу приложение Spring Boot, которое будет одновременно принимать несколько сообщений из очереди. Для этого ему необходимо создать несколько объектов-потребителей. Есть ли у Spring хороший способ создания настраиваемого числа экземпляров одного и того же класса?

Клиент очереди, который я должен использовать, действует как пул потоков. Он создает один поток для каждого потребительского объекта, который я ему даю. Объекты-потребители получают только одно сообщение за раз, и им необходимо полностью обработать и подтвердить сообщение, прежде чем они смогут получить другое. Потребители не являются поточно-ориентированными, поэтому я не могу просто использовать одноэлементный экземпляр.

Я рассмотрел подход ниже, но он не подходит мне. Это выглядит как злоупотребление аннотацией @Component, потому что экземпляр Initializer не используется после его создания. Какой лучший способ сделать это?

@Component
public class Initializer {

    public Initializer(ConsumerRegistry registry, @Value("${consumerCount}") int consumerCount) {
        for (int i = 0; i < consumerCount; i++) {
            // Each registered consumer results in a thread that consumes messages.
            // Incoming messages will be delivered to any consumer thread that's not busy.
            registry.registerConsumer(new Consumer());
        }
    }

}

1 Ответ

1 голос
/ 19 октября 2019

ApplicationListener будет соответствовать вашим потребностям. Он получает уведомление о зарегистрированном событии, например, когда ApplicationContext готов. У вас будет полный доступ ко всем вашим бобам и инъекциям.

@Component
public class StartupApplicationListener implements ApplicationListener<ApplicationReadyEvent> {

    @Inject
    private ConsumerRegistry registry;

    @Inject
    @Value("${consumerCount}")
    private int consumerCount;

    @Override
    public void onApplicationEvent(ApplicationReadyEvent event) {
        //do your logic
        for (int i = 0; i < consumerCount; i++) {
            // Each registered consumer results in a thread that consumes messages.
            // Incoming messages will be delivered to any consumer thread that's not busy.
            registry.registerConsumer(new Consumer());
        }
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...