当两个应用程序都使用嵌入式activemq时,如何将Jms消息从一个spring-boot应用程序发送到另一个应用程序

我有两个spring-boot应用程序。 在receiver-application的Application.java中我有:

@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); } 

在sender-application中我只使用:

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

所以我只是将消息发送到receiver-application中指定的队列名称。 我在日志中得到以下内容

无法启动JMX连接器无法绑定到URL [rmi:// localhost:1099> / jmxrmi]:javax.naming.NameAlreadyBoundException:jmxrmi [根exception是java.rmi.AlreadyBoundException:

我已阅读以下post,并没有发现它非常令人鼓舞:

Spring引导 – 与单独的服务共享嵌入式JMS代理

它的结论是:

但正如我所提到的,我之前没有让它工作,也不确定它是否可行。 没有在Spring Boot docs中找到显式消息,它在这种组合中不起作用。

我怀疑嵌入式Spring Boot JMS代理背后的想法是仅允许本地内存集成测试,而不是将嵌入式JMS代理暴露给外部世界。

有人知道我想做什么确实可能吗? 如果没有,是否有任何关于如何使用嵌入式代理实现Spring-boot应用之间的消息传递的建议?

如果您的2个春季启动应用程序在同一个jvm上,您只需添加两个中只有一个的application.properties:

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

Spring Boot还可以在检测到ActiveMQ在类路径上可用时配置ConnectionFactory。 如果代理存在,则会自动启动并配置嵌入式代理(只要通过配置未指定代理URL)。

如果您的2个春季启动应用程序是2个不同的jvm:在一个春季启动应用程序,您需要:

在pom.xml中

    org.springframework.boot spring-boot-starter-activemq 1.4.3.RELEASE   org.springframework spring-jms  

在第二个:

在application.properties中

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

在pom.xml中

  org.springframework spring-jms  

对于每个应用程序有2个jvm,1的情况,默认情况下,spring boot将仅使用vm连接器配置AMQ,在第一个应用程序中,您需要添加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; } 

尝试为producer应用程序指定spring.activemq.brokerUrl=tcp://localhost:61616

这样,将禁用嵌入式ActiveMQ Broker,并将在61616端口上启动与另一个端口的连接。