亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

將初始化代碼添加到 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條經驗 獲得超22個贊

一個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 關注
  • 130 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號