Spring Boot 配置两个Rabbit Mq

 1.背景

一个spring boot项目配置一个rabbit mq很常见,如何配置两个以及两个以上的mq?本篇文章将结合代码说明如何配置两个rabbit mq(talk is cheap, show me the code)。

2.项目结构

<groupId>cn.honorzhang</groupId>
<artifactId>my-springboot-rabbitmq</artifactId>
<version>1.0.0</version>
   <modules>
        <module>my-springboot-rabbitmq-amqp</module>
        <module>my-springboot-rabbitmq-model</module>
    </modules>
<packaging>pom</packaging>
<parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.2.7.RELEASE</version></parent>

如上代码所示,本项目包含两个模型,一个model模型,主要定义mq传递消息所用的模型,解析mq消息并转换成自己设计的模型。amqp模型主要是两个mq的配置,mq的公共配置,以及收发消息的逻辑代码。本例中定义了两个mq,分别包含消息的生产,消息的接收。

3.代码的讲解

3.1 mq的配置

spring.rabbitmq.first.host=${spring.rabbitmq.first.host}
spring.rabbitmq.first.port=${spring.rabbitmq.first.port}
spring.rabbitmq.first.user=${spring.rabbitmq.first.user}
spring.rabbitmq.first.password=${spring.rabbitmq.first.password}
spring.rabbitmq.first.virtual-host=${spring.rabbitmq.first.virtual-host}
spring.rabbitmq.first.exchange=${spring.rabbitmq.first.exchange}
spring.rabbitmq.first.routing.key=${spring.rabbitmq.first.routing.key}

其中queue的名称配置为环境变量,在消费端@RabbitListener中直接读取此环境变量的值。

3.2 配置代码

@Configuration
@PropertySource(value = "classpath:first-mq-config.properties")
public class FirstMqConfig {

    @Bean(name = "firstConnectionFactory")
    @Primary
    public ConnectionFactory firstConnectionFactory(
            @Value("${spring.rabbitmq.first.host}") String host,
            @Value("${spring.rabbitmq.first.port}") String port,
            @Value("${spring.rabbitmq.first.user}") String username,
            @Value("${spring.rabbitmq.first.password}") String password,
            @Value("${spring.rabbitmq.first.virtual-host}") String virtualHost){

        return constructConnectionFactory(host, port, username, password, virtualHost);
    }

    @Bean(name = "firstRabbitTemplate")
    public RabbitTemplate firstRabbitTemplate(
            @Qualifier("firstConnectionFactory") ConnectionFactory connectionFactory
    ) {
        RabbitTemplate firstRabbitTemplate = new RabbitTemplate(connectionFactory);
        return firstRabbitTemplate;
    }


    // 配置监听1
    @Bean(name = "firstFactory")
    public SimpleRabbitListenerContainerFactory firstFactory(
            SimpleRabbitListenerContainerFactoryConfigurer configurer,
            @Qualifier("firstConnectionFactory") ConnectionFactory connectionFactory
    ) {
        SimpleRabbitListenerContainerFactory factory = new SimpleRabbitListenerContainerFactory();
        configurer.configure(factory, connectionFactory);
        return factory;
    }




    private ConnectionFactory constructConnectionFactory(
            String host, String port, String username, String password, String virtualHost){
        CachingConnectionFactory connectionFactory = new CachingConnectionFactory();
        connectionFactory.setHost(host);
        connectionFactory.setPort(Integer.parseInt(port));
        connectionFactory.setUsername(username);
        connectionFactory.setPassword(password);
        connectionFactory.setVirtualHost(virtualHost);

        return connectionFactory;
    }

}

还有mq的一般配置,对于发送消息的序列化配置,以及接收消息的模型转换配置

@Configuration
public class MqCommonConfig {
    @Bean
    public MessageConverter jackson2JsonMessageConverter(){
        return new Jackson2JsonMessageConverter();
    }

    /**
     * 解决方法:添加这个类进行序列化解析
     * 会自动识别
     * @param objectMapper json序列化实现类
     * @return mq 消息序列化工具
     */
    @Bean
    public MessageConverter jsonMessageConverter(ObjectMapper objectMapper) {
        return new Jackson2JsonMessageConverter(objectMapper);
    }
}

3.3 消费端与生产代码配置

生产端代码

@Resource(name = "firstRabbitTemplate")
    private RabbitTemplate firstRabbitTemplate;


    @Value("${spring.rabbitmq.first.exchange:@null}")
    private String firstExchange;

    @Value("${spring.rabbitmq.first.routing.key:@null}")
    private String firstRoutingKeyRoute;


public void sendMessageByFirstMq() {
        RabbitMqMsg rabbitMqMsg = constructMqMsg("first", "**********first**********");
        log.info("-------------------send first rabbit mq info-----------------");
        firstRabbitTemplate.convertAndSend(
                firstExchange, firstRoutingKeyRoute, rabbitMqMsg, generateMqHeader());

    }


private RabbitMqMsg constructMqMsg(String id, String text) {

        return RabbitMqMsg.builder()
                .msgId(id)
                .msgText(text)
                .build();

    }


private MessagePostProcessor generateMqHeader() {
        return message -> {
            MessageProperties properties = message.getMessageProperties();
            properties.setHeader("content-type", "application/json");
            properties.setHeader("content-encoding", "UTF-8");
            return message;
        };
    }

消费端代码

@RabbitListener(queues =  "${spring.rabbitmq.first.queue.name}",  containerFactory="firstFactory")
    public void processFirstMqMessage(@Payload RabbitMqMsg message) {
        log.info("**********processMessage first message****************: {}", message);
    }

4.运行结果

第三部分的代码只展示了配置一个mq,配置多个mq是依葫芦画瓢,自行配置即可,本例中作者配置了两个mq,分别发送消息与接收消息,最后结果如下图所示。

5.代码地址

本篇博客的完整代码地址为github

6.最后的话

本篇博客给出了spring boot配置多个mq的实例,代码在实际应用中跑通,欢迎一起交流。

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
Spring Boot 中使用 RabbitMQRabbit Message Queue)可以方便地实现消息驱动的应用程序。RabbitMQ 是一个开源的消息代理(message broker),它实现了 AMQP(Advanced Message Queuing Protocol)协议,用于在分布式系统中传递和接收消息。 要在 Spring Boot 中使用 RabbitMQ,你需要进行以下步骤: 1. 添加 RabbitMQ 的依赖:在 `pom.xml` 文件中添加 RabbitMQ 的依赖项,例如: ```xml <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-amqp</artifactId> </dependency> ``` 2. 配置 RabbitMQ 连接信息:在 `application.properties` 或 `application.yml` 文件中配置 RabbitMQ 的连接信息,例如: ```yaml spring.rabbitmq.host=localhost spring.rabbitmq.port=5672 spring.rabbitmq.username=guest spring.rabbitmq.password=guest ``` 3. 创建消息发送者和接收者:可以使用 Spring Boot 提供的 `RabbitTemplate` 类来发送和接收消息。你可以通过注入 `RabbitTemplate` 对象来使用它。 4. 定义消息队列和交换机:在发送和接收消息之前,需要定义消息队列和交换机。可以使用 `@RabbitListener` 注解来监听消息队列,并使用 `@RabbitHandler` 注解来处理接收到的消息。 5. 发送和接收消息:使用 `RabbitTemplate` 的方法来发送和接收消息。例如,使用 `convertAndSend()` 方法发送消息,使用 `@RabbitHandler` 注解的方法来处理接收到的消息。 通过以上步骤,你可以在 Spring Boot 中使用 RabbitMQ 来实现可靠的消息传递和处理,并构建消息驱动的应用程序。
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值