为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

慕少森 2023-11-10 16:54:28
TLDR:我希望我的 Spring Boot 应用程序在启动时运行一些初始化代码。该代码需要访问 Spring bean 和值。我正在编写一个 Spring Boot 应用程序,它将同时使用队列中的多条消息。为了做到这一点,它需要实例化多个消费者对象。Spring是否有一个好方法来实例化可配置数量的同一类实例?我必须使用的队列客户端充当线程池。它为我提供的每个消费者对象创建一个线程。消费者对象一次只能接收一条消息,并且它们必须完全处理并确认该消息才能接收另一条消息。消费者不是线程安全的,所以我不能只使用单例实例。我考虑了下面的方法,但我觉得不合适。这似乎是对注释的滥用,@Component因为Initializer实例在构造后并未使用。有什么更好的方法呢?@Componentpublic 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 回答

?
茅侃侃

TA贡献1842条经验 获得超21个赞

一个ApplicationListener会满足你的需要。它会收到有关注册事件的通知,例如当 ApplicationContext 准备就绪时。您将可以完全访问所有 Bean 和注入。


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

        }

    }

}


查看完整回答
反对 回复 2023-11-10
  • 1 回答
  • 0 关注
  • 80 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信