Приложение Spring Boot не запускается при сбое аварийного транспорта ActiveMQ

Я хочу, чтобы мое приложение 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 Failover.

Пример кода доступен на https://github.com/madoxas/jms-activemq-failover

я только что попробовал ваш код. приложение запускается и конечная точка отдыха достижима,

pvpkiran 06.08.2018 14:50

@pvpkiran, пожалуйста, попробуйте еще раз. В логах появляется предупреждение: Failed to connect to [tcp://non-existing-broker:61616] after: 10 attempt(s) continuing to retry. Выполняя curl http://localhost:8080/, получаю Connection refused.

madox 06.08.2018 15:01

@pvpkiran похоже, что вы не используете аварийный транспорт. Пожалуйста, убедитесь, что у вас есть failover:(... перед URL-адресом брокера. Я хочу, чтобы он работал с отказоустойчивым транспортом, так как он работает без него :)

madox 06.08.2018 15:07
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
4
3
2 158
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Один из способов добиться этого:

  1. Отключить автоматический запуск контейнера JMS с помощью свойства spring.jms.listener.auto-startup=false
  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();
            }
        }
    }
    

Я. Ты был прав. Я пропустил failover, собирался предложить такое же решение. для источников данных в Springboot есть свойство наподобие spring.datasource.continue-on-error=true. Но для jms такого нет. Вы можете создать ошибку в Springboot

pvpkiran 07.08.2018 09:41

Другие вопросы по теме