版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qq_15071263/article/details/84656566
文章目录
Springboot 2.0.x 简单集成Rabbit MQ 并实现消息发送和消费【Windows 环境下】
比较倾向于先学会,再了解,所以,介绍放在最后
先吃饱,再纠结下顿吃什么好
1、rabbit mq 基础支持,安装 Erlang 环境
安装软件,自己动手,丰衣足食,不赘述
2、安装 rabbit mq
3、激活 rabbit mq 的管理插件
// 通过管理员运行CMD,移动到 rabbit mq 的sbin 目录下
// 执行激活命令
rabbitmq-plugins.bat enable rabbitmq_management
// 重启 rabbit mq 让管理器生效
// 执行重启命令
net stop RabbitMQ && net start RabbitMQ
4、访问管理器页面
打开浏览器打开 http://localhost:15672
输入帐号 : guest
输入密码 : guest
登录
5、新建远程访问账户
登录完成后,新建一个账户用来进行远程访问
1、切换到Admin
2、展开add a user
3、输入帐号密码
4、tags 点击 admin【设置管理员权限】
5、点击下面紫色的按钮,add user,就创建成功了
6、配置Springboot 依赖和配置文件
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-amqp</artifactId>
</dependency>
spring:
rabbitmq:
host: '你的服务器 IP'
port: 5672
username: ****
password: ****
7、注册队列
// 为了防止引错包,把 import 贴上
import org.springframework.amqp.core.Queue;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
/**
* @author Created by 谭健 on 2018/11/28. 星期三. 17:04.
* © All Rights Reserved.
*/
@Configuration
public class RabbitMqConfig {
public static final String SMS = "SMS";
public static final String LOG = "LOG";
@Bean
Queue smsQueue() {
return new Queue(SMS);
}
@Bean
Queue logQueue() {
return new Queue(LOG);
}
}
8、发送消息
import com.zyfycs.college.config.amqp.RabbitMqConfig;
import com.zyfycs.college.plugin.rabbitmq.model.SmsModel;
import org.springframework.amqp.core.AmqpTemplate;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
/**
* @author Created by 谭健 on 2018/11/29. 星期四. 10:45.
* © All Rights Reserved.
* @Component("customRabbitTemplate") 请务必指定value,或者使用其他的类名
* 因为spring 里面已经有一个 RabbitTemplate 了
* 但是 bean 重名会导致启动失败,而且不会抛出任何错误,注意,不会报任何错误,如果不知道,很多人可能会被坑好几天
*/
@Component("customRabbitTemplate")
public class RabbitTemplate {
@Autowired
private AmqpTemplate amqpTemplate;
public void sms(Long memberId,String mobilePhone,String content,boolean groupSend){
SmsModel smsModel = SmsModel.builder()
.groupSend(groupSend)
.memberId(memberId)
.mobile(mobilePhone)
.content(content)
.build();
// 使用非常简单,直接指定发送到哪个队列,然后携带参数即可
amqpTemplate.convertAndSend(RabbitMqConfig.SMS,smsModel);
}
}
9、管理器监控
启动项目后,到管理中心可以看到注册的 2个 队列
队列中暂时没有消息,也没有消息被消费关于可靠性,我测试了1100万的消息堆积,大概1个小时不到,没有一条失败
关于持久化,Springboot 默认帮我们实现了队列持久化和消息持久化,MQ 重启后,队列和消息都不会消失扫描二维码关注公众号,回复: 4543392 查看本文章
交换机
一般情况下,根据项目情况而定,如果业务较小,使用默认交换机即可
10、如何清理掉测试发送的消息
点击队列名称,进入子页面
点击 Purge 清理消息
如果找不到这个按钮,请把Overview 收起来
11、消费消息
import com.zyfycs.college.config.amqp.RabbitMqConfig;
import com.zyfycs.college.core.Constant;
import com.zyfycs.college.core.po.system.Message;
import com.zyfycs.college.core.type.TypeMessageType;
import com.zyfycs.college.dao.jpa.common.MessageRepo;
import com.zyfycs.college.plugin.yunqixun.sms.Sms;
import com.zyfycs.college.plugin.rabbitmq.model.SmsModel;
import org.springframework.amqp.rabbit.annotation.RabbitListener;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
/**
* @author Created by 谭健 on 2018/11/28. 星期三. 17:20.
* © All Rights Reserved.
*
* 短信消息队列 消费者
*/
@Component
public class SmsRecive {
@Autowired
private MessageRepo messageRepo;
// 只需要添加 @RabbitListener(queues = RabbitMqConfig.SMS) 就可以把这个方法指定为某个队列的消费者
// 如果拥有极其大量的消息需要消费,请配置交换机,以及消息确认ACK,否则会出现较多消息不能ACK
// 参考值:当消息队列中有超过一千条消息堆积时可以考虑配置
@RabbitListener(queues = RabbitMqConfig.SMS)
public void recive(SmsModel smsModel) {
Sms.Result result;
if (smsModel.isGroupSend()) {
result = Sms.groupSend(smsModel.getMobile(), smsModel.getContent());
} else {
result = Sms.send(smsModel.getMobile(), smsModel.getContent());
}
if (result.isSuccess()) {
createMessage(smsModel.getContent(), smsModel.getMemberId());
}
}
private void createMessage(String content, Long memberId) {
Message message = new Message();
message.setAddressee(memberId);
message.setTitle("短信");
message.setHasRead(false);
message.setValue(content);
message.setSender(Constant.SENDER_SYSTEM_SMS);
message.setType(TypeMessageType.NORMAL.name());
messageRepo.save(message);
}
}