SpringBoot集成RabbitMQ系列 本文主要整理RabbitMQ的简单介绍,安装,配置,使用rabbitMQ发送消息,几种交换机的类型,消费消息,消息回调机制,手动确认机制,后续等我学习并实践死信相关知识之后再做RabbitMQ的其他文章。
本文主要整理RabbitMQ的简单介绍,安装,配置,使用rabbitMQ发送消息,几种交换机的类型,消费消息,消息回调机制,手动确认机制,后续等我学习并实践死信相关知识之后再做RabbitMQ的其他文章。
前言
本来RabbitMQ之前只是简单了解,后来出了一个破功能是PDF上传的,上传倒是没啥,还要转图片,这个时候我就在想为啥不直接传图片,一共就几张,然后就很纳那个玛卡巴卡的闷....。。说正事,,,结果反正贼慢,后续引进RabbitMQ的异步处理,然后就借此机会了解了一下MQ,本篇文章作为同事了解MQ用,和自己喜欢屯文章所用一、RabbitMQ是什么?
RabbitMQ是实现了高级消息队列协议(AMQP)的开源消息代理软件(亦称面向消息的中间件)。RabbitMQ服务器是用Erlang语言编写的,而集群和故障转移是构建在开放电信平台框架上的。所有主要的编程语言均有与代理接口通讯的客户端库。(百度百科)
二、使用步骤
1.安装
1.1 windows
下载比较麻烦直接贴上网盘地址
链接:https://pan.baidu.com/s/1RvBRkI8RpOkxdlDBYZiyrA
提取码:46i3
版本如下
然后安装方法网上一堆
1.2 mac
mac可以使用docker镜像或者brew安装
2 搭建
安装完RabbitMQ之后打开网页输入http://localhost:15672即可访问到登录页面,默认的账户和密码都是是guest
然后我们在这个页面可以创建用户,交换机,队列,绑定啥的,说白了,等写程序的时候等于用程序去创建绑定这些东西。
2.1 预热阶段(pom、xml)
使用Rabbit也是比较简单,只需要pom文件中放入,当然版本自己随便定义,我的是为了符合SpringCloud用的2.1.4稳定版本
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-amqp</artifactId>
<version>2.1.4.RELEASE</version>
</dependency>
yml配置也比较简单,这里只写了可以链接rabbitmq的配置,后续的消息回调以及手动确认机制的yml配置稍后在做补充
spring:
rabbitmq:
host: 127.0.0.1
port: 5672
username: guest
password: guest
2.2 just litter coder阶段
下边进入代码实际操作环节,provider和customer的关系可以是A产B消,B产A消,自产自销,此处的A和B都是指的是分布式SOA架构的单个服务。
2.2.1 交换机类型
分别为直连交换机(DIRECT)、主题交换机(TOPIC)、扇形交换机(FONOUT)
简单画了一下这几种交换机
2.2.1.1 direct
歇歇再写
2.2.1.2 topic
歇歇再写
2.2.1.3 fonout
歇歇再写
2.2.2 消息回调机制
歇歇再写
2.2.3 自动确认与手动确认
歇歇再写
2.2.3.1 自动确认
歇歇再写
2.2.3.2 手动确认
spring:
rabbitmq:
host: 172.0.0.1
port: 5672
username: guest
password: guest
publisher-confirms: true #开启发送确认
publisher-returns: true #开启发送失败回退
listener:
direct:
acknowledge-mode: manual #采取手动应答
simple:
acknowledge-mode: manual
retry:
enabled: true # 是否支持重试
package com.newclass.config.mq;
import lombok.extern.slf4j.Slf4j;
import org.springframework.amqp.core.Message;
import org.springframework.amqp.rabbit.connection.ConnectionFactory;
import org.springframework.amqp.rabbit.connection.CorrelationData;
import org.springframework.amqp.rabbit.core.RabbitTemplate;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
/**
* @Author : DC
**/
@Slf4j
@Configuration
public class RabbitConfig {
@Bean
public RabbitTemplate createRabbitTemplate(ConnectionFactory connectionFactory){
RabbitTemplate rabbitTemplate = new RabbitTemplate();
rabbitTemplate.setConnectionFactory(connectionFactory);
//设置开启Mandatory,才能触发回调函数,无论消息推送结果怎么样都强制调用回调函数
rabbitTemplate.setMandatory(true);
rabbitTemplate.setConfirmCallback(new RabbitTemplate.ConfirmCallback() {
//①消息推送到server,但是在server里找不到交换机
//消息推送到sever,交换机和队列啥都没找到
@Override
public void confirm(CorrelationData correlationData, boolean ack, String cause) {
if(ack==true){
log.info("ConfirmCallback 确认情况,MQ消息发送 :"+ack);
}else {
log.error("ConfirmCallback 确认情况,MQ消息未发送 :"+ack);
log.error("ConfirmCallback 原因 :"+cause);
}
}
});
rabbitTemplate.setReturnCallback(new RabbitTemplate.ReturnCallback() {
//消息推送到server,找到交换机了,但是没找到队列
@Override
public void returnedMessage(Message message, int replyCode, String replyText, String exchange, String routingKey) {
log.warn("ReturnCallback: 消息:{}",message);
log.warn("ReturnCallback: 回应码:{}",replyCode);
log.warn("ReturnCallback: 回应信息:{}",replyText);
log.warn("ReturnCallback: 交换机:{}",exchange);
log.warn("ReturnCallback: 路由键:{}",routingKey);
}
});
return rabbitTemplate;
}
}