【问题标题】:Start and Stop @JmsListener启动和停止@JmsListener
【发布时间】:2016-07-19 21:04:29
【问题描述】:

我正在使用 spring boot 并且有 @EnableJms

如果我只使用注释 @JmsListener(destination = "xxxxxx") 并依赖于 spring boot 自动配置,我如何知道我将它设置为自动启动 false 来启动和停止 jmslistener

 jms:
    listener:
      max-concurrency: 10
      concurrency: 1
      auto-startup: false

问题是我如何访问SimpleMessageListenerContainerDefaultMessageListenerContainer

【问题讨论】:

    标签: spring-boot spring-jms


    【解决方案1】:

    请参阅this answer - 可以通过注册表访问各个容器,或者您可以启动/停止注册表以启动/停止所有容器。

    编辑

    这是一个bug,我开了一个JIRA Issue;一种解决方法是在启动之前重置自动启动...

    @SpringBootApplication
    public class So36332914Application {
    
        public static void main(String[] args) throws Exception {
            ConfigurableApplicationContext context = SpringApplication.run(So36332914Application.class, args);
            JmsTemplate template = context.getBean(JmsTemplate.class);
            JmsListenerEndpointRegistry registry = context.getBean(JmsListenerEndpointRegistry.class);
            System.out.println(registry.getListenerContainerIds().size() + " containers");
            System.out.println("Running: " + registry.isRunning());
    
            // https://jira.spring.io/browse/SPR-14105
            for (MessageListenerContainer container : registry.getListenerContainers()) {
                ((AbstractJmsListeningContainer) container).setAutoStartup(true);
            }
            registry.start();
            System.out.println("Running: " + registry.isRunning());
            template.convertAndSend("foo", "bar");
            registry.stop();
            System.out.println("Running: " + registry.isRunning());
            context.getBean(Foo.class).latch.await(10, TimeUnit.SECONDS);
            context.close();
        }
    
        @Bean
        public Foo foo() {
            return new Foo();
        }
    
        public static class Foo {
    
            private final CountDownLatch latch = new CountDownLatch(1);
    
            @JmsListener(destination="foo")
            public void foo(String foo) {
                System.out.println(foo);
                latch.countDown();
            }
    
        }
    
    }
    

    【讨论】:

    • 根据上面的答案,如果我停止/启动它工作正常。但是,如果我在属性文件中将 auto-start 设置为 false,然后在初始化后尝试启动它就不会启动,任何想法
    • 看起来像一个错误;我打开了一个 JIRA 问题 - 请查看我的编辑以了解解决方法。
    • 感谢更新,我确实循环了它们并直接在容器上启动,但修复自动启动更干净
    • 看看这里,不是你想要达到的目标,而是......stackoverflow.com/questions/32588352/…
    猜你喜欢
    • 2020-06-30
    • 2015-12-11
    • 2016-12-19
    • 1970-01-01
    • 1970-01-01
    • 2012-11-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多