Joh*_*pha 5 java messaging activemq-classic spring-boot
我有两个 spring-boot 应用程序。在接收器应用程序的 Application.java 中,我有:
@Bean
public JmsListenerContainerFactory<?> myFactory(ConnectionFactory connectionFactory, DefaultJmsListenerContainerFactoryConfigurer configurer) {
DefaultJmsListenerContainerFactory factory = new DefaultJmsListenerContainerFactory();
configurer.configure(factory, connectionFactory);
return factory;
}
Run Code Online (Sandbox Code Playgroud)
并在 Receiver.java ...
@JmsListener(destination = "myQueue", containerFactory = "myFactory")
public void receiveMessage(String tradeString) throws JSONException, IOException {
tradeImpl = new ObjectMapper().readValue(tradeString, TradeImpl.class);
}
Run Code Online (Sandbox Code Playgroud)
在发件人应用程序中,我只是使用:
public void send(trade) {
String queueName = "myQueue";
String tradeString = new ObjectMapper().writeValueAsString(trade);
jmsTemplate.convertAndSend(queueName, tradeString);
}
Run Code Online (Sandbox Code Playgroud)
所以我只是将消息发送到接收器应用程序中指定的队列名称。我在日志中得到以下信息
无法启动 JMX 连接器无法绑定到 URL [rmi://localhost:1099>/jmxrmi]: javax.naming.NameAlreadyBoundException: jmxrmi [Root 异常是 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
Run Code Online (Sandbox Code Playgroud)
Spring Boot 还可以在检测到 ActiveMQ 在类路径上可用时配置 ConnectionFactory。如果代理存在,则会自动启动和配置嵌入式代理(只要没有通过配置指定代理 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>
Run Code Online (Sandbox Code Playgroud)
在第二个:
在 application.properties 中
spring.activemq.broker-url=tcp://localhost:61616
Run Code Online (Sandbox Code Playgroud)
在 pom.xml 中
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-jms</artifactId>
</dependency>
Run Code Online (Sandbox Code Playgroud)
如果您有 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;
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
4745 次 |
| 最近记录: |