使用IDEA搭建 SpringBoot集成RabbitMQ系列(一):RabbitMQ的简单使用

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

猜你喜欢

转载自blog.csdn.net/luck_sheng/article/details/118085703
今日推荐