目录
- 前提说明
- 代码实现
- 1. 依赖
- 2. 配置类
- 3. 生产方
- 创建测试类,目的:查看是否队列交换机创建成功,且在队列里面是否有一条待消费的信息。
- 4. 消费方
- 最后
前提说明
背景条件:主要是自己学完了RabbitMQ后,想自己多去动手实践实践。
具体的需求:用户在注册成功以后,需要发送一条邮件消息,通知用户注册成功。
为什么要采用MQ
- 巩固复习
- 采用异步的操作,主要是为了避免容许出错操作的失败导致已经成功的操作回滚。
具体使用的技术
- Springboot
- RabbitMQ 3.11.4
- Erlang 25.1
- jdk 8
步骤图
-
说一下,我为什么采用的是Direct 模式:
假如以后需求需要变动的话,那么可以通过 改变routing key 来改变队列。
-
文字阐述一下具体的步骤:
- 创建交换机以及队列,并实现他们的绑定关系
- 在生产方,也就是注册完成后,需要调用API去指定 交换机名 以及 队列名 以及 发送信息表示已经注册成功。
- 在消费方,如果有发送信息为注册成功,则表示我可以进行邮件发送操作了。
-
考虑到注册成功后邮件发送的行为主要是一个辅助操作,不要求必须成功,所以不需要保证其操作必须成功。
代码实现
代码组成结构
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】学习笔记