Spring Boot JMS AutoStartup

时间:2016-09-23 06:30:19

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

我正在尝试在Spring Boot App中手动启动/停止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 true和 执行jmsListenerEndpointRegistry. isRunning () is true

之前jmsListenerEndpointRegistry.start();

是否有必要配置其他内容?也许我不想重写一些自动配置。

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

我在我的bean中发现了一些不一致的内容:

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

即使我注册了几个带有这样注释的听众:

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

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

编辑2:@JmsListener启动甚至自动启动设置为false

我检查了每个容器的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>

1 个答案:

答案 0 :(得分:3)

你必须要有其他东西 - 我刚写了一个快速启动应用程序(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()方法中使用调试器来查看它的启动原因。