背景条件:主要是自己学完了RabbitMQ后,想自己多去动手实践实践。
具体的需求:用户在注册成功以后,需要发送一条邮件消息,通知用户注册成功。
为什么要采用MQ
具体使用的技术
步骤图

说一下,我为什么采用的是Direct 模式:
假如以后需求需要变动的话,那么可以通过 改变routing key 来改变队列。
文字阐述一下具体的步骤:
考虑到注册成功后邮件发送的行为主要是一个辅助操作,不要求必须成功,所以不需要保证其操作必须成功。
代码组成结构

org.springframework.boot spring-boot-starter-web org.springframework.boot spring-boot-starter-test test org.springframework.boot spring-boot-starter-amqp
@Configuration
public class RabbitmqConfig {/*** 1. 创建交换机*/@Beanpublic DirectExchange directExchange(){// 创建一条 DirectExchange 路由模式的交换机:名称为 order_direct_exchange,持久化,不自动删除return new DirectExchange("direct_exchange", true, false);}/*** 2. 创建队列*/@Beanpublic Queue emailQueue(){// 构造一个新队列,指定名称emailQueue、持久性、可以绑定其他的交换机和不自动删除标志。return new Queue("emailQueue" , true, false,false );}/*** 3. 绑定队列以及交换机*/@Beanpublic Binding emailDirectBinding(){return BindingBuilder.bind(emailQueue()).to(directExchange()).with("email");}
}
@Service
public class UserServiceImpl {@Autowiredprivate RabbitTemplate rabbitTemplate;/*** 模拟业务操作*/public void register(){// do somethingSystem.out.println("用户已经注册完成,开始异步用MQ发送消息,其中的routing key为:email,通知用户注册完成");// 向队列发送消息:队列名称为direct_exchange,路由key为email,发送主体为字符串registerSuccessrabbitTemplate.convertAndSend("direct_exchange", "email", "registerSuccess");}
}
@SpringBootTest
public class TestRegisterMQ {@Autowiredprivate UserServiceImpl userServiceImpl;/*** 1、 进行生产测试,查看消息是否MQ已经发送到指定的Queue里面*/@Testvoid testRegister(){userServiceImpl.register();}
}
此时,控制台打印出来:

在浏览器输入网址:http://localhost:15672,输入账户即可进入rabbitmq后台管理页面(默认为guest/guest)
可以查看到已经创建出队列以及交换机并且实现了绑定关系。

我们再查看队列里面是否有一条待消费的信息:

从上述步骤,我们就可以看出,已经生产出一条待消费的信息。
// 监听的队列为 emailQueue
@RabbitListener(queues = {"emailQueue"})
@Service
public class EmailServiceImpl {// 通过传递的不同发送主体,进行消息处理@RabbitHandlerpublic void sendEmail(String msg){System.out.println("消息方接收到的消息为" + msg);System.out.println("现在正在进行邮件发送处理。。。。。。");// do something}
}
启动主启动类,会看到消息已经被消费:
控制台是确定是否已经接受到信息:

我们进一步确认,在队列里面阻塞的消息是否已经被消费:

至此,一个简单的使用场景就已经实现完毕了。
如果对RabbiMQ有不了解的地方,可以查看相应的笔记:【RabbitMQ】学习笔记