SpringBoot整合RabbitMQ

前言

工作模式:基于RabbitMQ的发布/订阅(pub/sub)工作模式,其他工作模式大同小异。
交换机类型:扇形交换机(Fanout Exchange)

我们需要创建一个生产者和一个消费者项目,消费者项目包含邮件消费者和短信消费者。

一、生产者环境搭建

新建SpringBoot项目,按以下步骤操作:

1. Maven依赖信息
 <!-- SpringBoot对amqp的支持 -->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-amqp</artifactId>
        </dependency>
        <!-- SpringBoot整合web组件-->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
2. 配置文件 application.yml
spring:
  rabbitmq:
    # 连接地址
    host: 127.0.0.1
    # 端口号
    port: 5672
    # 账号
    username: guest
    # 密码
    password: guest
    # 虚拟主机(类似于数据库名)
    virtual-host: /admin_vhost
3. 配置类

新建FanoutConfig.java

package com.example.member.config;

import org.springframework.amqp.core.Binding;
import org.springframework.amqp.core.BindingBuilder;
import org.springframework.amqp.core.FanoutExchange;
import org.springframework.amqp.core.Queue;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

@Configuration
public class FanoutConfig {
    //邮件队列
    private static final String FANOUT_EMAIL_QUEUE = "fanout_email_queue";
    //短信队列
    private static final String FANOUT_SMS_QUEUE = "fanout_sms_queue";

    //交换机名称
    private static final String EXCHANGE_NAME = "fanoutExchange";

    //1. 定义队列,默认支持持久化
    //定义邮件队列
    @Bean
    public Queue fanoutEmailQueue(){
        return new Queue(FANOUT_EMAIL_QUEUE);
    }

    //定义短信队列
    @Bean
    public Queue fanoutSmsQueue(){
        return new Queue(FANOUT_SMS_QUEUE);
    }


    //2.定义交换机(使用其他交换机类型,直接更改返回值类型即可)
    @Bean
    FanoutExchange fanoutExchange(){
        return new FanoutExchange(EXCHANGE_NAME);
    }


    /**
     * 3. 队列(邮件、短信)与交换机绑定
     * 注意:参数名称和定义队列和交换机的方法名称必须一致,默认将参数名作为id去查找是否有对应的方法,类似于传统配置的ref=“xxxID”
     * @param fanoutEmailQueue
     * @param fanoutExchange
     * @return
     */
    @Bean
    Binding bindingExchangeEamil(Queue fanoutEmailQueue, FanoutExchange fanoutExchange) {
        return BindingBuilder.bind(fanoutEmailQueue).to(fanoutExchange);
    }

    @Bean
    Binding bindingExchangeSms(Queue fanoutSmsQueue, FanoutExchange fanoutExchange) {
        return BindingBuilder.bind(fanoutSmsQueue).to(fanoutExchange);
    }

}
4. 发送消息(Producer)
@Component
public class FanoutProducer {
    @Autowired
    private AmqpTemplate amqpTemplate;

    /**
     * 发送消息
     * @param queueName 队列名
     */
    public void send(String queueName){
        String msg = "my_fanout_exchange "+new Date();
        System.out.println("生产者发送消息:"+msg);
        amqpTemplate.convertAndSend(queueName,msg);
    }
}
5. 控制层调用
@RestController
public class FanoutController {
    @Autowired
    private FanoutProducer fanoutProducer;

    @GetMapping("/sendMsg")
    public String sendMsg(String queueName){
        fanoutProducer.send(queueName);
        return "success!";
    }
}



二、消费者环境搭建
1. Maven依赖信息
 <!-- SpringBoot对amqp的支持 -->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-amqp</artifactId>
        </dependency>
        <!-- SpringBoot整合web组件-->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
2. 配置文件 application.yml
server:
  port: 8081
spring:
  rabbitmq:
    # 连接地址
    host: 127.0.0.1
    # 端口号
    port: 5672
    # 账号
    username: guest
    # 密码
    password: guest
    # 虚拟主机(类似于数据库名)
    virtual-host: /admin_vhost
3. 消费消息(Consumer)

拓展:消息序列化以及消费者的两种写法

邮件消费者:

import org.springframework.amqp.rabbit.annotation.RabbitHandler;
import org.springframework.amqp.rabbit.annotation.RabbitListener;
import org.springframework.stereotype.Component;

/**
 * 邮件消费者
 */
@Component
@RabbitListener(queues = "fanout_email_queue")
public class FanoutEmailConsumer {

    @RabbitHandler
    public void process(String msg){
        System.out.println("邮件消费者获取生产者消息: " + msg);
    }
}

短信消费者:

import org.springframework.amqp.rabbit.annotation.RabbitHandler;
import org.springframework.amqp.rabbit.annotation.RabbitListener;
import org.springframework.stereotype.Component;

/**
 * 短息消费者
 */
@Component
@RabbitListener(queues = "fanout_sms_queue")
public class FanoutSmsConsumer {

    @RabbitHandler
    public void process(String msg){
        System.out.println("短信消费者获取生产者消息: " + msg);
    }
}



三、测试

先启动生产者,然后启动消费者。

注意:生产者启动后并不会马上创建队列,若此时启动消费者会报错提示找不到队列,只有我们第一次向队列投递消息时队列才会创建
1. 我们向fanout_email_queue队列发送一条消息

在这里插入图片描述
此时邮件消费者收到了消息:
在这里插入图片描述

2. 我们再向fanout_sms_queue队列发送一条消息:

在这里插入图片描述
此时短信消费者收到了消息:
在这里插入图片描述


SpringBoot整合其实很简单,这里仅仅是一个入门,后面还有更多的需要我们去学习,如RabbitMQ如何解决分布式事务等?



------------------------------------------------------------- 学习不易,需要坚持-------------------------------------------------------------------------------
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值