当两个应用程序都使用嵌入式activemq

时间:2016-12-28 20:09:37

标签: java spring-boot activemq messaging

我有两个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&gt; / jmxrmi]:javax.naming.NameAlreadyBoundException:jmxrmi [根异常是java.rmi.AlreadyBoundException:

我已阅读以下帖子并且没有发现它非常令人鼓舞:

Spring boot - sharing embedded JMS broker with separate service

总结如下:

  

但正如我所提到的,我之前没有做过这项工作,也不确定是否有可能。没有在Spring Boot文档中找到明确的消息,它在这种组合中不起作用。

     

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

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

2 个答案:

答案 0 :(得分:4)

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

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

Spring Boot还可以在检测到时配置ConnectionFactory   ActiveMQ在类路径上可用。如果经纪人在场,   嵌入式代理自动启动和配置(只要   没有通过配置指定代理URL。

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

在pom.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的情况,默认情况下,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;
}

答案 1 :(得分:1)

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

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