【问题标题】:How to Lazy Load RabbitMQ queue using @Lazy in spring boot?如何在 Spring Boot 中使用 @Lazy 延迟加载 RabbitMQ 队列?
【发布时间】:2021-04-21 11:13:06
【问题描述】:

实际上,在我的 RabbitMQ 配置中,我为每个队列声明了 10 个消费者。所以所有消费者线程都是在我的 Spring Boot 应用程序完全启动之前创建的,因此应用程序启动需要时间。

我想在我的项目启动时延迟加载我所有的 Rabbitmq 队列。我尝试在配置类上使用@Lazy,但它似乎不起作用。

有没有办法声明延迟加载队列?

【问题讨论】:

  • 或许能帮到你link

标签: spring-boot rabbitmq lazy-loading spring-rabbit


【解决方案1】:

@RabbitListener(或侦听器容器)上设置autoStartup="false"

然后手动启动监听器。

https://docs.spring.io/spring-amqp/docs/current/reference/html/#container-management

对于@RabbitListener 或仅start() 容器,如果它们是豆类的话。

【讨论】:

  • 我在 SimpleMessageListenerContainer 中的 setMessageListener 中配置我的侦听器(不使用 @Rabbitlister 注释)如果我已将自动启动属性设置为 false,如何在这种情况下启动侦听器,因为在这种情况下它们未在 RabbitListenerEndpointRegistry 中注册
  • 你可以使用普通的bean注入(@Autowired等)。
  • 我已经使用 ApplicationContext 的 getBean 方法注入了 ListenerClass bean,但是 listenerClass 没有开始监听(队列中已经有一些数据)。我也尝试使用@Inject 注入 listenerclass 但它也不起作用
  • 你需要启动SimpleMessageListenerContainer bean而不是监听类。
  • 好;请参阅stackoverflow.com/help/someone-answers - 它可能对其他人有所帮助。
【解决方案2】:

您只需将“autoStartup=false”设置为@RabbitListener:

@RabbitListener(queues = "${yourqueue}",autoStartup = "false")

然后找到所有注册的兔子监听器并启动它:

    public static void main(String[] args) {

    ConfigurableApplicationContext run = SpringApplication.run(SimPurchaseApplication.class, args);

    RabbitListenerEndpointRegistry rabbitListeners = run.getBean(RabbitListenerEndpointRegistry.class);
    for (MessageListenerContainer listenerContainer : rabbitListeners.getListenerContainers()){
        listenerContainer.start();
    }
}

【讨论】:

    猜你喜欢
    • 2016-09-18
    • 1970-01-01
    • 1970-01-01
    • 2013-08-01
    • 1970-01-01
    • 1970-01-01
    • 2016-06-06
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多