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

2023-12-08

我有两个 spring-boot 应用程序。在接收器应用程序的 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);
}

在发送者应用程序中我只需使用:

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

所以我只是将消息发送到接收者应用程序中指定的队列名称。 我在日志中得到以下内容

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

我读过以下文章,但并没有觉得它很令人鼓舞:

Spring boot - 与单独的服务共享嵌入式 JMS 代理

它的结论是:

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

我怀疑嵌入式 Spring Boot JMS 代理背后的想法是仅允许本地内存集成测试,而不是向外界公开嵌入式 JMS 代理。

有谁知道我想做的事情是否确实可能?如果没有,是否有关于如何使用嵌入式代理在 spring-boot 应用程序之间实现消息传递的建议?


如果你的 2 个 spring boot 应用程序位于同一个 jvm 上,你只需仅添加两者之一的 application.properties :

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

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

如果您的 2 个 Spring Boot 应用程序位于 2 个不同的 jvm 上: 在一个 Spring Boot 应用程序中,您需要:

在 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>

在第二个中:

在应用程序属性中

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;
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

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

随机推荐