【RabbitMQ】注册成功后的通知操作

前提说明

背景条件:主要是自己学完了RabbitMQ后,想自己多去动手实践实践。

具体的需求:用户在注册成功以后,需要发送一条邮件消息,通知用户注册成功。

为什么要采用MQ

  • 巩固复习
  • 采用异步的操作,主要是为了避免容许出错操作的失败导致已经成功的操作回滚。

具体使用的技术

  • Springboot
  • RabbitMQ 3.11.4
  • Erlang 25.1
  • jdk 8

步骤图
在这里插入图片描述

  • 说一下,我为什么采用的是Direct 模式:

    假如以后需求需要变动的话,那么可以通过 改变routing key 来改变队列。

  • 文字阐述一下具体的步骤:

    1. 创建交换机以及队列,并实现他们的绑定关系
    2. 在生产方,也就是注册完成后,需要调用API去指定 交换机名 以及 队列名 以及 发送信息表示已经注册成功。
    3. 在消费方,如果有发送信息为注册成功,则表示我可以进行邮件发送操作了。
  • 考虑到注册成功后邮件发送的行为主要是一个辅助操作,不要求必须成功,所以不需要保证其操作必须成功。

代码实现

代码组成结构
在这里插入图片描述

1. 依赖


    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>

        <!-- RabbitMQ依赖    -->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-amqp</artifactId>
        </dependency>
    </dependencies>

2. 配置类

@Configuration
public class RabbitmqConfig {

    /**
     * 1. 创建交换机
     */
    @Bean
    public DirectExchange directExchange(){
        // 创建一条 DirectExchange 路由模式的交换机:名称为 order_direct_exchange,持久化,不自动删除
        return new DirectExchange("direct_exchange", true, false);
    }

    /**
     * 2. 创建队列
     */
    @Bean
    public Queue emailQueue(){
        // 构造一个新队列,指定名称emailQueue、持久性、可以绑定其他的交换机和不自动删除标志。
        return new Queue("emailQueue" , true, false,false );
    }

    /**
     * 3. 绑定队列以及交换机
     */
    @Bean
    public Binding emailDirectBinding(){
        return BindingBuilder.bind(emailQueue()).to(directExchange()).with("email");
    }
}

3. 生产方

@Service
public class UserServiceImpl {

    @Autowired
    private RabbitTemplate rabbitTemplate;

    /**
     * 模拟业务操作
     */
    public void register(){
        // do something

        System.out.println("用户已经注册完成,开始异步用MQ发送消息,其中的routing key为:email,通知用户注册完成");
        // 向队列发送消息:队列名称为direct_exchange,路由key为email,发送主体为字符串registerSuccess
        rabbitTemplate.convertAndSend("direct_exchange", "email", "registerSuccess");
    }
}

创建测试类,目的:查看是否队列交换机创建成功,且在队列里面是否有一条待消费的信息。

@SpringBootTest
public class TestRegisterMQ {

    @Autowired
    private UserServiceImpl userServiceImpl;

    /**
     * 1、 进行生产测试,查看消息是否MQ已经发送到指定的Queue里面
     */
    @Test
    void testRegister(){
        userServiceImpl.register();
    }
}

此时,控制台打印出来:
在这里插入图片描述
在浏览器输入网址:http://localhost:15672,输入账户即可进入rabbitmq后台管理页面(默认为guest/guest)

可以查看到已经创建出队列以及交换机并且实现了绑定关系。
在这里插入图片描述
我们再查看队列里面是否有一条待消费的信息:
在这里插入图片描述
从上述步骤,我们就可以看出,已经生产出一条待消费的信息。

4. 消费方

// 监听的队列为 emailQueue
@RabbitListener(queues = {"emailQueue"})
@Service
public class EmailServiceImpl {

    // 通过传递的不同发送主体,进行消息处理
    @RabbitHandler
    public void sendEmail(String msg){
        System.out.println("消息方接收到的消息为" + msg);
        System.out.println("现在正在进行邮件发送处理。。。。。。");
        // do something
    }
}

启动主启动类,会看到消息已经被消费:

控制台是确定是否已经接受到信息:
在这里插入图片描述
我们进一步确认,在队列里面阻塞的消息是否已经被消费:
在这里插入图片描述

最后

至此,一个简单的使用场景就已经实现完毕了。

如果对RabbiMQ有不了解的地方,可以查看相应的笔记:【RabbitMQ】学习笔记

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值