簡體   English   中英

Spring Boot JMS 自動啟動

[英]Spring Boot JMS AutoStartup

我正在嘗試在我的 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 true並且jmsListenerEndpointRegistry. isRunning () is true jmsListenerEndpointRegistry. 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>

你一定有其他事情發生 - 我剛剛寫了一個快速啟動應用程序(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()方法中使用調試器來查看它啟動的原因。

順序很重要,配置后 factory.setAutoStartup(autoStartup)。

@Bean
public JmsListenerContainerFactory<?> ShipmentListenerFactory(@Qualifier("GSUBCachingConnectionFactory") CachingConnectionFactory connectionFactory,
                                                          DefaultJmsListenerContainerFactoryConfigurer configurer) {
    DefaultJmsListenerContainerFactory factory = new DefaultJmsListenerContainerFactory();
    // This provides all boot's default to this factory, including the message converter

    // Added ability to disable not start listener
    boolean autoStartup = env.getProperty("app-env.CKPT_QUEUE_AUTO_START",Boolean.class,true);
    log.info("[MQ] CKPT_QUEUE_AUTO_START:{}",autoStartup);

    configurer.configure(factory, connectionFactory);
    factory.setAutoStartup(autoStartup);
    // You could still override some of Boot's default if necessary.
    return factory;
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM