在Spring Boot中内嵌启动ActiveMQ

613 阅读2分钟

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服务器,并配置了客户端与之交互。这种方式非常适合于开发和测试环境,可以极大地简化部署流程,并且提供了一种快速验证消息传递逻辑的方式。