ActiveMQ故障转移传输失败时,Spring Boot应用程序无法启动

时间:2018-08-06 12:36:03

标签: java spring spring-boot activemq spring-jms

我希望我的Spring Boot应用程序启动,无论它是否可以连接到JMS。我有这个最小的例子:

@SpringBootApplication
@EnableJms
public class JmsActivemqFailoverApplication {

    public static void main(String[] args) {
        SpringApplication.run(JmsActivemqFailoverApplication.class, args);
    }

    @Component
    public static class JmsReceiver {
        @JmsListener(destination = "inbox")
        public void receive(Message message) {
            System.out.println("Received <" + message + ">");
        }
    }

    @RestController
    public static class HelloWorldController {
        @GetMapping("/")
        public String helloWorld() {
            return "Hello world";
        }
    }
}

application.properties包含以下内容:

spring.activemq.broker-url=tcp://non-existing-broker:61616

我可以从helloWorld端点获得响应。当我将属性更改为:

spring.activemq.broker-url=failover:(tcp://non-existing-broker:61616)

应用程序一直尝试连接到代理,但是我无法从REST端点获得响应。

请告知,如何在不等待ActiveMQ故障转移传输成功的情况下运行应用程序。

示例代码可从https://github.com/madoxas/jms-activemq-failover

获得

1 个答案:

答案 0 :(得分:1)

实现此目标的一种方法是:

  1. 使用属性spring.jms.listener.auto-startup=false禁用JMS容器自动启动
  2. 在应用程序启动后启动JMS容器:

    @Component
    public class JmsStarter implements ApplicationRunner {
        private final JmsListenerEndpointRegistry jmsRegistry;
    
        public JmsStarter(JmsListenerEndpointRegistry jmsRegistry) {
            this.jmsRegistry = jmsRegistry;
        }
    
        @Override
        public void run(ApplicationArguments args) {
            for (MessageListenerContainer listenerContainer : jmsRegistry.getListenerContainers()) {
                listenerContainer.start();
            }
        }
    }