Springboot 2.0.x 简单集成Rabbit MQ 并实现消息发送和消费【Windows 环境下】

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qq_15071263/article/details/84656566

Springboot 2.0.x 简单集成Rabbit MQ 并实现消息发送和消费【Windows 环境下】


比较倾向于先学会,再了解,所以,介绍放在最后
先吃饱,再纠结下顿吃什么好

1、rabbit mq 基础支持,安装 Erlang 环境

Erlang 官网,点我去下载页面

安装软件,自己动手,丰衣足食,不赘述

2、安装 rabbit mq

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);
    }
}

猜你喜欢

转载自blog.csdn.net/qq_15071263/article/details/84656566