2016-12-28 2 views
2

У меня есть два приложения для загрузки весной. в Application.java приемно-приложения у меня есть:Как отправить сообщение Jms из одного приложения для загрузки весны в другое, когда оба приложения используют встроенный activemq

@Bean 
public JmsListenerContainerFactory<?> myFactory(ConnectionFactory connectionFactory, DefaultJmsListenerContainerFactoryConfigurer configurer) { 
    DefaultJmsListenerContainerFactory factory = new DefaultJmsListenerContainerFactory(); 
    configurer.configure(factory, connectionFactory); 
    return factory; 
} 

и Receiver.java ...

@JmsListener(destination = "myQueue", containerFactory = "myFactory") 
public void receiveMessage(String tradeString) throws JSONException, IOException { 
    tradeImpl = new ObjectMapper().readValue(tradeString, TradeImpl.class); 
} 

В отправителе-приложения Я просто использую:

public void send(trade) { 
    String queueName = "myQueue"; 
    String tradeString = new ObjectMapper().writeValueAsString(trade); 
    jmsTemplate.convertAndSend(queueName, tradeString); 
} 

Так что я m просто отправляет сообщение в имя очереди, указанное в приложении-получателе. я получаю следующее в журналах

Не удалось запустить разъем JMX Невозможно привязать к URL [RMI: // локальный: 1099>/jmxrmi]: javax.naming.NameAlreadyBoundException: jmxrmi [исключение Корень java.rmi .AlreadyBoundException:

Я прочитал следующий пост и не нашел его очень обнадеживают:

Spring boot - sharing embedded JMS broker with separate service

в заключение:

Но Как я уже говорил, я не делал этого раньше и не уверен, что это возможно. Не нашел в Spring Boot docs явного сообщения, что он не работает в этой комбинации.

Я подозреваю, что идея встроенного буфера JMS Spring Boot JMS заключается в том, чтобы разрешить локальное тестирование интеграции с памятью, а не открывать встроенные JMS-брокеры во внешний мир.

Кто-нибудь знает, действительно ли то, что я хочу сделать, возможно? И если нет, есть ли какие-либо предложения о том, как я могу достичь обмена сообщениями между приложениями Spring-Boot с помощью встроенных брокеров?

+1

Если у вас есть 2 приложения для загрузки весной и включенное ActiveMQ, это означает, что AMQ встроен в одно из двух приложений весны нет? Почему бы не использовать внешний автономный AMQ? –

+0

Я мог бы сделать, но думаю, что я пойду таким образом в крайнем случае! У меня есть настоящее горячее любопытство, чтобы узнать, есть ли способ общения между приложениями, используя встроенный маршрут! Я, конечно, не женат на AMQ, поэтому я открыт для других встроенных решений. –

ответ

2

Если 2 пружинный загрузки приложения на той же JVM, вы просто должны добавить в application.properties только одного из двух:

spring.activemq.broker-url=vm://localhost 

Spring загрузки также можно настроить ConnectionFactory когда он обнаруживает , что ActiveMQ доступен в пути к классам. Если брокер присутствует, запускается и настраивается встроенный брокер (до тех пор, как URL-адреса брокера не указаны через конфигурацию).

Если 2 пружинные загрузки приложений находятся на 2 Дифференц JVM: В один весенний загрузки приложения вам нужно иметь:

В ПОМ.XML

<!-- https://mvnrepository.com/artifact/org.springframework.boot/spring-boot-starter-activemq --> 
    <dependency> 
     <groupId>org.springframework.boot</groupId> 
     <artifactId>spring-boot-starter-activemq</artifactId> 
     <version>1.4.3.RELEASE</version> 
    </dependency> 
    <dependency> 
     <groupId>org.springframework</groupId> 
     <artifactId>spring-jms</artifactId> 
    </dependency> 

Во втором:

В application.properties

spring.activemq.broker-url=tcp://localhost:61616 

В pom.xml

<dependency> 
    <groupId>org.springframework</groupId> 
    <artifactId>spring-jms</artifactId> 
</dependency> 

Для случая, что у вас есть 2 JVM, 1 для каждое приложение. По умолчанию весенняя загрузка настроит AMQ только с vm-коннектором, в первом приложении вам нужно добавить tcp-коннектор, как это :

@Bean(initMethod = "start", destroyMethod = "stop") 
public BrokerService broker() throws Exception { 
    final BrokerService broker = new BrokerService(); 
    broker.addConnector("tcp://localhost:61616"); 
    broker.addConnector("vm://localhost"); 
    broker.setPersistent(false); 
    return broker; 
} 
1

Просьба указать spring.activemq.brokerUrl=tcp://localhost:61616 для приложения producer.

Таким образом, встроенный брокер ActiveMQ будет отключен, и будет выполнено соединение с другим, запущенным на порту 61616.

+0

Добавлено, но приложение теперь отвечает: Исключение без рубрики произошло во время обработки JMS; Вложенное исключение - javax.jms.JMSException: Не удалось подключиться к URL-адресу брокера: tcp: // localhost: 61616. Причина: java.net.ConnectException: Connection reject ", Нужно ли добавлять какие-либо дополнения к app.properties моего потребителя? –

+0

Да ... Похож на' broker.addConnector ("tcp: // localhost: 61616") ; broker.addConnector ("vm: // localhost: 0"); 'должен быть там. См. другой ответ по этому вопросу. –

+0

' VMTransportFactory' не выставляет «порт» для прослушивания. –

Смежные вопросы