Я хочу, чтобы мое приложение 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, пожалуйста, попробуйте еще раз. В логах появляется предупреждение: Failed to connect to [tcp://non-existing-broker:61616] after: 10 attempt(s) continuing to retry.
Выполняя curl http://localhost:8080/
, получаю Connection refused
.
@pvpkiran похоже, что вы не используете аварийный транспорт. Пожалуйста, убедитесь, что у вас есть failover:(...
перед URL-адресом брокера. Я хочу, чтобы он работал с отказоустойчивым транспортом, так как он работает без него :)
Один из способов добиться этого:
spring.jms.listener.auto-startup=false
Запустить контейнер 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
я только что попробовал ваш код. приложение запускается и конечная точка отдыха достижима,