【问题标题】:Spring Boot JMS AutoStartupSpring Boot JMS 自动启动
【发布时间】:2017-01-31 21:59:06
【问题描述】:

我正在尝试在我的 Spring Boot 应用程序中手动启动/停止 JMS 侦听器。我目前正在对我的容器工厂使用以下配置:

@EnableJms
public class ConfigJms {
...
    @Bean(name = "queueContainerFactory")
    public JmsListenerContainerFactory<?> queueContainerFactory(ConnectionFactory cf) {

        ActiveMQConnectionFactory amqCf = (ActiveMQConnectionFactory) cf;
        amqCf.setTrustAllPackages(true);
        SimpleJmsListenerContainerFactory factory = new SimpleJmsListenerContainerFactory();
        factory.setConnectionFactory(amqCf);
        **factory.setAutoStartup(false);** 
        return factory;
    }
...
}

在测试factory.setAutoStartup(false); 之后,我很困惑,因为即使指示不为此工厂容器启动任何侦听器,侦听器也已经注册并在上下文启动时启动。

我使用jmsListenerEndpointRegistry 测试了这种情况。

jmsListenerEndpointRegistry.isAutoStartup() is truejmsListenerEndpointRegistry. isRunning () is true 执行前jmsListenerEndpointRegistry.start();

是否需要配置其他东西?也许我忽略了一些自动配置。

编辑 1:JmsListenerEndpointRegistry 侦听器的状态无效

我在我的 bean 中发现了一些不一致的地方:

jmsListenerEndpointRegistry.getListenerContainerIds().size() 始终为 0。 jmsListenerEndpointRegistry.isAutoStartup() 只是一个返回 true 的方法。

即使我用这样的注释注册了几个监听器:

@JmsListener(containerFactory="queueContainerFactory", destination = "${dest}")

jmsListenerEndpointRegistry 不显示有关这些侦听器状态的信息,但它们在启动时连接到 ActiveMQ。 (检查 ActiveMQ 管理控制台)

编辑 2:即使自动启动设置为 false,@JmsListener 也会启动

我检查了每个容器的jmsListenerEndpointRegistry,但我不知道这是一个错误还是我没有正确定义配置。但是,我只是按照前面的说明定义容器工厂,将 AUTO-START 设置为 false,并且两个侦听器都已启动并使用消息(正在运行)。

来自我的日志文件:

jmsListenerEndpointRegistry ID <org.springframework.jms.JmsListenerEndpointContainer#1>, Auto-Startup <false>, Running <true>
jmsListenerEndpointRegistry ID <org.springframework.jms.JmsListenerEndpointContainer#0>, Auto-Startup <false>, Running <true>

【问题讨论】:

  • 您是否在应用程序上下文中明确使用start()autoStartup 仅与上下文初始化期间的上下文调用有关。在创建后在上下文上调用 start() 时它没有任何影响,这会启动所有 bean,而不管 autoStartup
  • 没有。我只是在 spring boot 上调用 run () 。可以被子 run() 调用吗?
  • 请在 GitHub 上分享我们这边的一些简单的 Spring Boot 应用程序。我记得Spring Cloud Stream有一个start()的问题,顺便说一句...

标签: spring spring-boot spring-integration ioc-container spring-jms


【解决方案1】:

你肯定有其他事情发生了——我刚刚写了一个快速启动应用程序(1.4.1)并且容器没有启动......

@SpringBootApplication
public class So39654027Application {

    public static void main(String[] args) {
        ConfigurableApplicationContext context = SpringApplication.run(So39654027Application.class, args);
        JmsListenerEndpointRegistry reg = context.getBean(JmsListenerEndpointRegistry.class);
        MessageListenerContainer listenerContainer = reg.getListenerContainer("foo");
        System.out.println(listenerContainer.isRunning());
    }

    @Bean(name = "queueContainerFactory")
    public JmsListenerContainerFactory<?> queueContainerFactory(ConnectionFactory cf) {

        ActiveMQConnectionFactory amqCf = (ActiveMQConnectionFactory) cf;
        amqCf.setTrustAllPackages(true);
        SimpleJmsListenerContainerFactory factory = new SimpleJmsListenerContainerFactory();
        factory.setConnectionFactory(amqCf);
        factory.setAutoStartup(false);
        return factory;
    }

    @JmsListener(id="foo", destination = "so39654027", containerFactory = "queueContainerFactory")
    public void listen(String foo) {
        System.out.println(foo);
    }

}

还有……

2016-09-23 09:24:33.428  INFO 97907 --- [           main] com.example.So39654027Application        : Started So39654027Application in 1.193 seconds (JVM running for 2.012)
false

我建议你在容器的start() 方法中使用调试器来查看它启动的原因。

【讨论】:

  • 这是我的错误。我正在执行 JmsListenerEndpointRegistry 两次。在 start() 上进行调试也很有用。
猜你喜欢
  • 2020-01-16
  • 2018-03-27
  • 2022-01-24
  • 2015-10-25
  • 1970-01-01
  • 2016-11-04
  • 2016-01-21
  • 2020-08-25
  • 1970-01-01
相关资源
最近更新 更多