SpringBoot 框架整合RabbitMQ 实现消息服务
实验场景:当用户注册成功后,可以选择向用户发送注册邮件或者注册短信通知。
1.在系统中安装 RabbitMQ 消息服务(1)先安装 Erlang 语言包并配置环境变量
(2)安装 RabbitMQ 安装包
(3)在 RabbitMQ 安装目录 sbin 文件夹下,打开 cmd 窗口,安装 RabbitMQ
可视化管理插件
(4)在浏览器上访问 http://localhost:15672(用户名和密码均为 guest)
2.新建一个 Spring Boot 框架项目作为消息生产者,项目名为“rabbitmq_producer”,框架中需要集成 Web 开发。
(1)添加 RabbitMQ 依赖(spring-boot-starter-amqp)和 Thymeleaf 依赖
org.springframework.boot spring-boot-starter-amqp2.7.0
(2)在 application.properties 配置文件中添加 RabbitMQ 消息服务连接
相关配置
# 配置RabbitMQ消息中间件连接配置 spring.rabbitmq.host=localhost spring.rabbitmq.port=5672 spring.rabbitmq.username=guest spring.rabbitmq.password=guest #配置RabbitMQ虚拟主机路径/,默认可以省略 spring.rabbitmq.virtual-host=/
(3)创建消息代理配置类,完成交换器(Exchange)、队列(sms_queue、
email_queue)、绑定(Bingding)以及消息转换器(Jackson2JsonMessageConverter)
的配置。
@Configuration
public class RabbitMQConfig {
//定义常量
public static final String TOPIC_EXCHANGE="topic_exchange";
public static final String SMS_QUEUE_NAME="sms_queue";
public static final String EMAIL_QUEUE_NAME="email_queue";
//1.交换机
@Bean("exchange")
public Exchange exchange(){
return ExchangeBuilder.topicExchange(TOPIC_EXCHANGE).durable(true).build();
}
//定义短信消息队列
@Bean("sms_queue")
public Queue sms_queue(){
return QueueBuilder.durable(SMS_QUEUE_NAME).build();
}
//定义邮件消息队列
@Bean("email_queue")
public Queue email_queue(){
return QueueBuilder.durable(EMAIL_QUEUE_NAME).build();
}
//将消息队列与交换机进行绑定
@Bean("bindingSmsFanout")
public Binding bindingSmsFanout(){
return BindingBuilder.bind(sms_queue()).to(exchange()).with("").noargs();
}
@Bean("bindingEmailFanout")
public Binding bindingEmailFanout(){
return BindingBuilder.bind(email_queue()).to(exchange()).with("").noargs();
}
//消息转换器(Jackson2JsonMessageConverter)
@Bean
public MessageConverter messageConverter(){
return new Jackson2JsonMessageConverter();
}
}
(4)自行设计注册页面,用户可以输入用户名、密码、手机号和邮箱,并可以选择发短信或者发邮件。当用户单击“注册”按钮,可以将用户填写的信息发送到 RabbitMQ 消息队列中。
controller层
@Controller
public class UserController {
@Autowired
private UserServer userServer;
@RequestMapping("/registerPage")
public String RegisterPage(){
return "/views/register";
}
@RequestMapping("/register")
@ResponseBody
public String Register(User user){
Boolean flag=userServer.setRabbitTemplate(user);
if (flag) {
return "注册成功";
}else return "注册失败";
}
}
逻辑层
@Service
public class UserServer {
@Autowired
private RabbitTemplate rabbitTemplate;
public Boolean setRabbitTemplate(User user){
try {
for (int i=0;i
3.新建一个 Spring Boot 框架项目作为消息消费者
项目名为“rabbitmq_consumer”,框架中需要集成 Web 开发。
(1)添加 RabbitMQ 依赖(spring-boot-starter-amqp)
org.springframework.boot
spring-boot-starter-amqp
2.7.0
(2)在 application.properties 配置文件中添加 RabbitMQ 消息服务连接相关配置
# 应用服务 WEB 访问端口
server.port=8081
# 配置RabbitMQ消息中间件连接配置
spring.rabbitmq.host=localhost
spring.rabbitmq.port=5672
spring.rabbitmq.username=guest
spring.rabbitmq.password=guest
#配置RabbitMQ虚拟主机路径/,默认可以省略
spring.rabbitmq.virtual-host=/
(3)创建消息代理配置类,完成消息转换器(Jackson2JsonMessageConverter)的配置。
@Configuration
public class RabbitConfig {
@Bean
public MessageConverter messageConverter(){
return new Jackson2JsonMessageConverter();
}
}
(4)创建一个消息接收和处理的类 RabbitMQListener,添加两个方法分别监听队列(sms_queue、email_queue)
监听 sms_queue 队列的消费者在控制台打印出“向【手机号】成功发送短信,内容:恭喜您,【账户名】,注册成功。”
监听 email_queue 队列的消费者在控制台打印出“向【邮箱】成功发送邮3件,内容:恭喜您,【账户名】,注册成功。”
@Component
public class RabbitMQListener {
//邮箱
@RabbitListener( queues = "email_queue")
public void emailQueue(User user){
System.out.println("向"+user.getEmil()+"成功发送邮箱,内容:恭喜您,"+user.getUsername()+",注册成功。");
}
//电话
@RabbitListener(queues = "sms_queue")
public void smsQueue(User user){
System.out.println("向"+user.getPhone()+"成功发送短信,内容:恭喜您,"+user.getUsername()+",注册成功。");
}
}
4.注意点
-
第一次先启动消费者,后启动生产者。因为刚开始在mq中没有缓存的内容,在第二次等rabbitmq里面缓存了queue和exchange等消息就可以先启动生产者
-
一定要将将消息队列与交换机进行绑定
-
消费者的queue一定要和生产者的一致



