参考
- 《Spring Boot实战派》
- 消息队列RabbitMQ入门与5种模式详解(讲解了用户权限的问题,可以看一看)
- springboot(集成篇):RabbitMQ集成详解
必看
- 如果要发送对象,发送的对象需要继承
Serializable
类
- 可以创建多个消费者,消息会均匀的分配给消费者
- 任务失败后会自动重试,建议自己处理一下这方面的问题
建议
环境
- Springboot 2.3.7.RELEASE
- amqp(pom.xml内添加,未设置具体版本)
- otp_win64_24.1.7(win安装文件)
- rabbitmq-server-3.9.10(win安装文件)
正文
pom.xml
添加依赖
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-amqp</artifactId>
</dependency>
</dependencies>
- 创建配置类、声明队列并绑定队列
/**
* 配置mq交换器及声明队列
* @Author 夏秋初
* @Date 2021/11/27 19:48
*/
@Configuration
public class RabbitConfig {
/**
* 声明email队列
* @return
*/
@Bean
public Queue userEmailVerify() {
// true表示持久化该队列
return new Queue("user.email.verify", true);
}
// /**
// * 声明交互器 topic
// * @return
// */
// @Bean
// TopicExchange topicExchange() {
// return new TopicExchange("topicExchange");
// }
/**
* 声明交互器/交换机 direct
* @return
*/
@Bean
DirectExchange directExchange() {
return new DirectExchange("direct.exchange");
}
/**
* 绑定email队列,并设置路由key,如果还有别的队列,再创建一个函数绑定即可
* @return
*/
@Bean
public Binding bindingUserEmailVerify() {
return BindingBuilder.bind(userEmailVerify()).to(directExchange()).with("user.email.verify");
}
}
- 创建生产者(书上说可以发送对象,这边测试会报错不支持的格式,待文章写完后再解决)
/**
* 发送者
* @Author 夏秋初
* @Date 2021/11/27 19:54
*/
@Component
public class UserEmailVerifyProducer {
@Resource
private AmqpTemplate amqpTemplate;
/**
* 发送邮件队列
* @param userVerificationCodeEmailDto
*/
public void sendEmail(UserEmailVerifyDto userVerificationCodeEmailDto){
System.out.println("生产者 user.email.verify 发送消息: "+userVerificationCodeEmailDto);
/**
* 第一个参数指定交换机
* 第二个参数指定队列
* 第三个参数指定消息内容
*/
amqpTemplate.convertAndSend("direct.exchange", "user.email.verify", userVerificationCodeEmailDto.toString());
}
}
- 创建消费者
/**
* 消费者
* @Author 夏秋初
* @Date 2021/11/27 20:23
*/
@Component
// 监听指定队列
@RabbitListener(queues = "user.email.verify")
public class UserEmailVerifyConsumer {
@RabbitHandler
public void process(String content){
System.out.println("消费者 user.email.verify 收到消息: "+content
);
}
}
- 用户实体
/**
* @Author 夏秋初
* @Date 2021/11/27 20:00
*/
@Data
public class UserEmailVerifyDto implements Serializable {
private String email;
private Integer code;
private String content = "您的邮箱验证码为:%d,请不要告诉别人哦";
}
application.properties
配置文件内添加配置参数
# 如果访问局域网的mq服务,需要配置账户并允许远程访问 ,参考:https://www.cnblogs.com/xiaqiuchu/p/15616432.html
spring.rabbitmq.host=192.168.211.2
# 指定端口号
spring.rabbitmq.port=5672
# 指定账号,默认账号不可以在其他机器登录
spring.rabbitmq.username=testmail
# 指定密码
spring.rabbitmq.password=testmail
测试
- 运行本项目
- 访问控制台可以看到该交换机
- 点击进入交换机详情可以看到交换机内部的队列
- 测试发送消息显示消费者接受到