[英]how to send message from one spring application to another using JMS
[英]How to send Jms message from one spring-boot application to another when both apps use embedded activemq
我有两个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 [根异常是java.rmi.AlreadyBoundException:
我已经阅读了以下帖子并且没有发现它非常令人鼓舞:
它的结论是:
但正如我所提到的,我之前没有让它工作,也不确定它是否可行。 没有在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中
<!-- 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;
}
尝试为producer
应用程序指定spring.activemq.brokerUrl=tcp://localhost:61616
。
这样,将禁用嵌入式ActiveMQ Broker,并将在61616
端口上启动与另一个端口的连接。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.