gpt4 book ai didi

java - 将初始化代码添加到 Spring Boot 应用程序的正确方法是什么?

转载 作者:行者123 更新时间:2023-11-30 05:26:38 26 4
gpt4 key购买 nike

TLDR:我希望我的 Spring Boot 应用程序在启动时运行一些初始化代码。该代码需要访问 Spring bean 和值。

我正在编写一个 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());
}
}

}

最佳答案

ApplicationListener 可以满足您的需求。它会收到有关注册事件的通知,例如当 ApplicationContext 准备好时。您将拥有对所有 Bean 和注入(inject)的完全访问权限。

@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());
}
}
}

关于java - 将初始化代码添加到 Spring Boot 应用程序的正确方法是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58444261/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com