1. 引言
在开发环境中,有时我们希望能够在Spring Boot应用程序内部启动一个完整的ActiveMQ消息中间件实例,以避免额外的部署步骤和简化测试环境的搭建。本文档将指导您如何在Spring Boot应用中内嵌启动ActiveMQ服务器,并配置客户端与之通信。
2. 添加服务端依赖
首先,我们需要在项目的pom.xml文件中添加ActiveMQ服务器端的依赖项。
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-activemq</artifactId>
</dependency>
<dependency>
<groupId>org.apache.activemq</groupId>
<artifactId>activemq-kahadb-store</artifactId>
</dependency>
</dependencies>
3. 配置ActiveMQ服务器
@Slf4j
@Configuration
public class ActiveMqConfig {
/**
* 默认消息存活时间,默认24小时
*/
long DEFAULT_TO_LIVE = 1000 * 60 * 60 * 24;
@PostConstruct
public void brokerService() {
BrokerService brokerService = new BrokerService();
try {
brokerService.setBrokerName("broker");
brokerService.setUseJmx(true);
brokerService.addConnector("tcp://0.0.0.0:61616");
brokerService.start();
log.info("ActiveMqConfig brokerService tcp://0.0.0.0:61616 started successfully");
} catch (Exception e) {
log.error("ActiveMqConfig brokerService error:{}", e);
//启动失败,退出程序
e.printStackTrace();
}
}
@Bean
public JmsTemplate jmsTemplate(ConnectionFactory connectionFactory) {
JmsTemplate template = new JmsTemplate();
template.setConnectionFactory(connectionFactory);
template.setDeliveryPersistent(true);
template.setExplicitQosEnabled(true);
template.setTimeToLive(DEFAULT_TO_LIVE);
return template;
}
}
4. 配置ActiveMQ客户端
我们还需要配置客户端来连接到内嵌的ActiveMQ服务器。为此,我们需要配置spring.activemq属性以指向内嵌服务器。
Properties
深色版本
# application.properties 示例
spring.activemq.broker-url=vm://localhost
spring.activemq.user=admin
spring.activemq.password=admin
spring.activemq.packages.trust-all=true
或者使用 YAML 格式:
Yaml
深色版本
# application.yml 示例
spring:
activemq:
broker-url: vm://localhost
user: admin
password: admin
packages:
trust-all: true
5. 创建消息生产者和消费者
接下来,我们将创建一个简单的消息生产者和消费者。
生产者
Java
深色版本
import org.springframework.jms.core.JmsTemplate;
import org.springframework.stereotype.Component;
@Component
public class MessageProducer {
private final JmsTemplate jmsTemplate;
public MessageProducer(JmsTemplate jmsTemplate) {
this.jmsTemplate = jmsTemplate;
}
public void sendMessage(String destinationName, String message) {
jmsTemplate.convertAndSend(destinationName, message);
}
}
消费者
Java
深色版本
import org.springframework.jms.annotation.JmsListener;
import org.springframework.stereotype.Component;
@Component
public class MessageConsumer {
@JmsListener(destination = "testQueue")
public void receiveMessage(String message) {
System.out.println("Received message: " + message);
}
}
6. 测试
最后,我们可以在Spring Boot应用启动时发送一条消息到队列,然后观察消费者是否能够正确接收消息。
Java
深色版本
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.CommandLineRunner;
import org.springframework.stereotype.Component;
@Component
public class AppCommandLineRunner implements CommandLineRunner {
private final MessageProducer producer;
@Autowired
public AppCommandLineRunner(MessageProducer producer) {
this.producer = producer;
}
@Override
public void run(String... args) throws Exception {
producer.sendMessage("testQueue", "Hello from Spring Boot!");
}
}
7. 结论
通过上述步骤,您已经成功地在Spring Boot应用中内嵌启动了ActiveMQ服务器,并配置了客户端与之交互。这种方式非常适合于开发和测试环境,可以极大地简化部署流程,并且提供了一种快速验证消息传递逻辑的方式。