快速尝鲜:RabbitMQ 搭建完就得用起来

安装部署RabbitMQ 一、什么是MQ 消息队列(Message Queue,简称MQ),从字面意思上看,本质是个队列,FIFO先入先出,只不过队列中存放的内容是message而已 作用:应用程序“对”应用程序的通信方法。 应用场景 主要解决异步处理、应用解耦、流量削锋等问题,实现高性能,高可用,可伸缩和最终一致性架构 1.异步处理 用户注册后,需要发注册邮件和注册短信 2.应用解耦 用户下单后,订单系统需要通知库存系统... 阅读详情

在项目真正开始之前我们先来简单介绍下 RabbitMQ 的工作流程:

  • 生产者往交换机中发送消息;
  • 交换机通过规则绑定队列,通过路由键将消息存储到队列中;
  • 消费者获取队列中的消息进行消费;

环境:SpringBoot 2.6.3、JDK 1.8

项目搭建

首先创建 SpringBoot 项目 rabbit-mq

  1. 引入依赖
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-amqp</artifactId>
</dependency>

复制代码

  1. yml 文件配置
spring:
  rabbitmq:
    host: 127.0.0.1     //rabbitMQ服务地址
    port: 15672   //这个地方暂时先用我们之前配置的15672
    username: cheetah   //自己的账户名
    password: 123456    //自己的密码

复制代码

  1. 直连交换机

本项目以直连交换机为例,至于其他的交换机类型将在后文中给出详细介绍。

@Configuration
public class DirectRabbitConfig {


    /**
     * 定义交换机
     **/
    @Bean
    public DirectExchange directExchange(){
        /**
         * 交换机名称
         * 持久性标志:是否持久化,默认是 true 即声明一个持久的 exchange,该exchange将在服务器重启后继续运行
         * 自动删除标志:是否自动删除,默认为 false, 如果服务器想在 exchange不再使用时删除它,则设置为 true
         **/
        return new DirectExchange("directExchange", true, false);
    }


    /**
     * 定义队列
     **/
    @Bean
    public Queue directQueue(){
        /**
         * name:队列名称
         * durable:是否持久化,默认是 true,持久化队列,会被存储在磁盘上,当消息代理重启时仍然存在
         * exclusive:是否排他,默认为 false,true则表示声明了一个排他队列(该队列将仅由声明者连接使用),如果连接关闭,则队列被删除。此参考优先级高于durable
         * autoDelete:是否自动删除, 默认是 false,true则表示当队列不再使用时,服务器删除该队列
         **/
        return new Queue("directQueue",true);
    }


    /**
     * 队列和交换机绑定
     * 设置路由键:directRouting
     **/
    @Bean
    Binding bindingDirect(){
        return BindingBuilder.bind(directQueue()).to(directExchange()).with("directRouting");
    }




}

复制代码

  1. 消息发送
@RestController
public class SendMessageController {


    @Autowired
    private RabbitTemplate rabbitTemplate;


    @GetMapping("/sendMessage")
    public String sendMessage(){
        //将消息携带路由键值
        rabbitTemplate.convertAndSend("directExchange", "directRouting", "发送消息!");
        return "ok";
    }


}

复制代码

我们先启动程序,在浏览器访问下

http://127.0.0.1:9001/sendMessage

报错如下:

我们之前已经给该用户分配过权限了,如果之前未分配,直接在客户端中配置:

之所以访问不到,是因为我们使用的端口号不正确

所以我们需要将端口改为 5672 (如果是阿里云服务器实例,需要将该端口 开放权限 )

我们再来访问下

http://127.0.0.1:9001/sendMessage

请求返回"OK",控制台输出

客户端相关页面截图如下:

  1. 消息消费
@Component
@RabbitListener(queues = "directQueue")//监听队列名称
public class MQReciever {


    @RabbitHandler
    public void process(String message){
        System.out.println("接收到的消息是:"+ message);
    }
}

复制代码

启动项目,发现消息已经被消费。

为了防止消息丢失, RabbitMQ 增加了消息确认机制:生产者消息确认机制和消费者消息确认机制。

确认机制

一、生产者消息确认机制

  1. 在 yml 中增加配置信息
spring:
  rabbitmq:
    #确认消息已发送到交换机(Exchange)
    publisher-confirm-type: correlated
    #确认消息已发送到队列(Queue)
    publisher-returns: true

复制代码


spring.rabbitmq.publisher-confirm 新版本已被弃用,现在使用 spring.rabbitmq.publisher-confirm-type = correlated 实现相同效果

  1. 增加回调
@Bean
public RabbitTemplate createRabbitTemplate(ConnectionFactory connectionFactory){
 RabbitTemplate rabbitTemplate = new RabbitTemplate();
 rabbitTemplate.setConnectionFactory(connectionFactory);
 //设置开启 Mandatory,才能触发回调函数,无论消息推送结果怎么样都强制调用回调函数
 rabbitTemplate.setMandatory(true);


 rabbitTemplate.setConfirmCallback(new RabbitTemplate.ConfirmCallback() {
  @Override
  public void confirm(CorrelationData correlationData, boolean ack, String cause) {
   System.out.println("ConfirmCallback:     "+"相关数据:"+correlationData);
   System.out.println("ConfirmCallback:     "+"确认情况:"+ack);
   System.out.println("ConfirmCallback:     "+"原因:"+cause);
  }
 });


 rabbitTemplate.setReturnsCallback(new RabbitTemplate.ReturnsCallback(){
  @Override
  public void returnedMessage(ReturnedMessage returned) {
   System.out.println("ReturnCallback:     "+"消息:"+returned.getMessage());
   System.out.println("ReturnCallback:     "+"回应码:"+returned.getReplyCode());
   System.out.println("ReturnCallback:     "+"回应信息:"+returned.getReplyText());
   System.out.println("ReturnCallback:     "+"交换机:"+returned.getExchange());
   System.out.println("ReturnCallback:     "+"路由键:"+returned.getRoutingKey());
  }
 });
 return rabbitTemplate;
}

复制代码

  • confirm 机制是只保证消息到达 exchange ,并不保证消息可以路由到正确的地方 queue
  • 当前的 exchange 不存在或者指定的路由 key 路由不到才会触发 return 机制

大家可以自行演示以下情况的执行结果:

  • 不存在交换机和队列
  • 存在交换机,不存在队列
  • 消息推送成功

二、消费者消息的确认机制

默认情况下如果一个消息被消费者正确接收则会从队列中移除。如果一个队列没被任何消费者订阅,那么这个队列中的消息会被缓存,当有消费者订阅时则会立即发送,进而从队列中移除。

消费者消息的确认机制可以分为以下 3 种:

  1. 自动确认

AcknowledgeMode.NONE 默认为自动确认,不管消费者是否成功处理了消息,消息都会从队列中被移除。

  1. 根据情况确认

AcknowledgeMode.AUTO 根据方法的执行情况来决定是否确认还是拒绝(是否重新入队列)

  • 如果消息成功被消费(成功的意思是在消费的过程中没有抛出异常),则自动确认
  • 当抛出 AmqpRejectAndDontRequeueException 异常的时候,则消息会被拒绝,且消息不会重回队列
  • 当抛出 ImmediateAcknowledgeAmqpException 异常,则消费者会被确认
  • 其他的异常,则消息会被拒绝,并且该消息会重回队列,如果此时只有一个消费者监听该队列,则有发生死循环的风险,多消费端也会造成资源的极大浪费,这个在开发过程中一定要避免的。可以通过 setDefaultRequeueRejected (默认是 true )去设置

可能造成消息丢失,一般是需要我们在 try-catch 捕捉异常后, 打印日志 用于追踪数据,这样找出对应数据再做后续处理。

  1. 手动确认

AcknowledgeMode.MANUAL 对于手动确认,也是我们工作中最常用到的,它的用法如下:

/*
 * 肯定确认
 * deliveryTag:消息队列数据的唯一id
 * multiple:是否批量 
 * true :一次性确认所有小于等于deliveryTag的消息
 * false:对当前消息进行确认;
 */
channel.basicAck(long deliveryTag, boolean multiple); 

复制代码

/*
 * 否定确认
 * multiple:是否批量 
 *   true:一次性拒绝所有小于deliveryTag的消息
 *   false:对当前消息进行确认;
 * requeue:被拒绝的是否重新入列,
 *   true:就是将数据重新丢回队列里,那么下次还会消费这消息;
 *   false:就是拒绝处理该消息,服务器把该消息丢掉即可。 
 */
channel.basicNack(long deliveryTag, boolean multiple, boolean requeue);

复制代码

/*
 * 用于否定确认,但与basicNack相比有一个限制,一次只能拒绝单条消息
 */
channel.basicReject(long deliveryTag, boolean requeue);  

复制代码

手动确认

在 yml 配置中开启手动确认模式

spring:
  rabbitmq:
    listener:
      simple:
        acknowledge-mode: manual

复制代码

或者在代码中开启

@Configuration
public class MessageListenerConfig {


    @Autowired
    private CachingConnectionFactory connectionFactory;


    @Autowired
    private MQReciever mqReciever;//消息接收处理类


    @Bean
    public SimpleMessageListenerContainer simpleMessageListenerContainer(){
        SimpleMessageListenerContainer container = new SimpleMessageListenerContainer(connectionFactory);
        //并发使用者的数量
        container.setConcurrentConsumers(1);
        //消费者人数上限
        container.setMaxConcurrentConsumers(1);
        container.setAcknowledgeMode(AcknowledgeMode.MANUAL); // RabbitMQ默认是自动确认,这里改为手动确认消息
        //设置一个队列,此处支持设置多个
        container.setQueueNames("directQueue");
        container.setMessageListener(mqReciever);
        return container;
    }
}

复制代码

消息消费类

@Component
@RabbitListener(queues = "directQueue")//监听队列名称
public class MQReciever implements ChannelAwareMessageListener {


    @Override
    public void onMessage(Message message, Channel channel) throws Exception {
        long deliveryTag = message.getMessageProperties().getDeliveryTag();
        try {
            String msg = message.toString();
            String[] msgArray = msg.split("'");//可以点进Message里面看源码,单引号直接的数据就是我们的map消息数据
            System.out.println("消费的消息内容:"+msgArray[1]);
            System.out.println("消费的主题消息来自:"+message.getMessageProperties().getConsumerQueue());
            
            //业务处理
            ......
            
            channel.basicAck(deliveryTag, true);
            
        } catch (Exception e) {
            //拒绝重新入队列
            channel.basicReject(deliveryTag, false);   
            e.printStackTrace();
        }
    }
} 
RabbitMQ原理(二):SpringAMQP编程 由于`RabbitMQ`采用了AMQP协议,因此它具备跨语言的特性。任何语言只要遵循AMQP协议收发消息,都可以与`RabbitMQ`交互。并且`RabbitMQ`官方也提供了各种不同语言的客户端。但是,RabbitMQ官方提供的Java客户端编码相对复杂,一般生产环境下我们更多会结合Spring来使用。而Spring的官方刚好基于RabbitMQ提供了这样一套消息收发的模板工具:SpringAMQP。并且还基于SpringBoot对其实现了自动装配,使用起来非常方便。 阅读详情

相关推荐

Docker:快速搭建 RabbitMQ 集群的技术指南

本文介绍了使用Docker快速搭建RabbitMQ集群及SpringBoot集成实践。通过docker-compose部署3节点RabbitMQ集群,并演示了SpringBoot项目中消息队列的配置、生产者和消费者实现。文章包含RabbitMQ集群搭建步骤、SpringBoot集成代码示例(队列定义、消息收发)、测试验证方法,并提供了生产环境配置建议。帮助开发者快速掌握RabbitMQ分布式消息系统的部署与应用开发。

木头 603

RabbitMQ工作流程详解

RabbitMQ工作流程详解

qq_38014879的博客 957

如何安装PyFluent

PyFluent 是PyAnsys生态系统的一部分, 允许您在所选的 Python 环境中结合使用 Fluent 与其他 PyAnsys 库和外部 Python 库一起使用。PyFluent 实现了客户端-服务器体系结构。它使用谷歌遥控器 过程调用或 gRPC 接口,用于启动或连接正在运行的 Fluent 进程作为服务器。但是,您只需要与 Python 交互接口。可以使用 PyFluent 以编程方式创建、交互和控制 Fluent 会话,用于创建您自己的自定义工作区。

B_etter_Man的博客 2928

RabbitMQ流程

RabbitMQ 1.简介 RabbitMQ是实现了高级消息队列协议的开源消息代理软件。RabbitMQ服务器是用Erlang语言编写的,而集群和故障时构建在开放电信平台框架上的。 2.RabbitMQ处理流程 1.首先有一个生产者(Publisher),他会跟消息中间件建立一条长链接,这条链接会有很多的通信,生产者发送一条消息必须带上一个route-key路由键,然后通过route-key绑定到对应的交互机(Exchange)上,然后交互机会绑定(Binding)对应的队列上(Queue),然后消费者(

qq_44880742的博客 1139

基于大疆TSDK与Pix4D的热红外数据工程化处理:从RJPG到温度正射影像的完整工作流

本文详细介绍了基于大疆TSDK与Pix4D的热红外数据工程化处理完整工作流。通过Python脚本自动化解析RJPG格式的热红外图像,提取并转换其中的原始辐射数据为包含真实温度信息的TIFF文件,再结合Pix4Dmapper进行批量拼接,最终生成可直接用于GIS分析的温度正射影像图。该流程解决了手动处理效率低下、参数校准复杂等难题,实现了从原始数据到定量分析成果的高效、准确、可重复生产。

weixin_29161785的博客 377

squirrel校园二手交易平台

squirrel校园二手交易平台 (适合寻找SSM项目练手的你。) 项目起源:   期末的课程设计,三人一组,我和两个舍友,一时起兴,决定做一个校园二手交易平台,一开始兴致与激情满满,可是后期时间上的冲突,让我们三个人对于这个项目有点累。   这个项目刚定题两天,BezosLee由于通过了360的网上在线笔试,收到了360公司的免费培训邀请,要去北京的360总部进行培训一周,值得庆...

K.SHI的博客 5万+

RabbitMQ到底是怎么运行的?

讲解RabbitMQ的具体工作流程,以及对RabbitMQ的核心概念进行讲解,让我们对RabbitMQ的认识更加深入。

一心同学的博客 2991

MATLAB闪退别慌!5分钟搞定Windows系统预设文件修复(附详细截图)

本文针对MATLAB在Windows系统下频繁闪退的问题,提供了快速有效的解决方案。核心在于修复或重置损坏的MATLAB预设文件,通过图文并茂的五步法,指导用户定位AppData目录、重命名预设文件夹,从而让MATLAB自动生成全新配置以解决闪退。文章还涵盖了问题诊断、设置备份及进阶排查方法,帮助用户彻底根除启动故障。

weixin_29234423的博客 928

快速搭建完 RabbitMQ 就得用起来

在项目真正开始之前我们先来简单介绍下RabbitMQ的工作流程: 生产者往交换机中发送消息; 交换机通过规则绑定队列,通过路由键将消息存储到队列中; 消费者获取队列中的消息进行消费; 环境:SpringBoot 2.6.3、JDK 1.8 项目搭建 首先创建SpringBoot项目rabbit-mq 引入依赖 <dependency> <groupId>org.springframework.boot</groupId> &...

m0_67645544的博客 556

代谢组数据分析(二十八):基于广义估计方程(GEE)的方法探究代谢物与临床表型相关性

本研究利用广义估计方程(GEE)方法对代谢组学数据进行了深入分析,旨在探究代谢物与临床表型之间的相关性。代谢组学数据具有高维性、样本间相关性以及混杂因素的复杂性,传统的统计方法难以有效处理这些问题。GEE方法通过引入相关性结构,能够有效地处理样本间的相关性,并同时调整多个混杂因素,从而提高了分析结果的准确性和可靠性。

专注生信领域 1278

摆脱英文束缚!群晖Transmission4.0.4全新中文界面攻略

在群晖安装完官方Transmission4.0.4套件后,界面是英文状态的,不太好用。但是按照网上分享的原来4.0以前版本的方法更新UI又失败,所以自己搞了下成功了,分享给需要的朋友。

XiaoqiangClub的博客 5220

RabbitMQ快速尝鲜

上文我们已经完成了RabbitMQ的安装,安完就要让它发挥点作用,今天就在SpringBoot项目里集成一下子,尝尝鲜! 生产者往交换机中发送消息; 交换机通过规则绑定队列,通过路由键将消息存储到队列中; 消费者获取队列中的消息进行消费; 环境:SpringBoot 2.6.3、JDK 1.8 项目搭建 首先创建SpringBoot项目 rabbit-mq 引入依赖.

阿Q的小窝 303

【Simulink教程案例9】基于simulink的BPSK,QPSK调制解调通信系统建模与仿真——使用simulink自带模块设计

BPSK (Binary Phase Shift Keying)-------二进制相移键控。是把模拟信号转换成数据值的转换方式之一,利用偏离相位的复数波浪组合来表现信息键控移相方式。BPSK使用了基准的正弦波和相位反转的波浪,使一方为0,另一方为1,从而可以同时传送接受2值(1比特)的信息。BPSK的映射关系如下所示:BPSK调制过程将输入的1010二进制数据中的0都转化为-1,使得非极性码变为极性码。

FPGA/MATLAB学习教程/源码/项目合作开发 3488

docker-compose搭建一个rabbitMQ集群

首先确保你的云服务器上已经安装了doker和docker-compose提示:以下是本篇文章正文内容,下面案例可供参考以上就是今天要讲的内容,本文仅仅简单介绍了rabbitMQ集群的搭建,如果想要更进一步的配置,比如挂载数据卷,可以修改docker-compose.yml文件,在其中挂上你需要的数据卷目录即可。

singletonGarfield的博客 2468

【Python基础】01 如何安装Python及集成环境

本文详细介绍了Python 3.13开发环境的完整搭建流程,涵盖三大操作系统(Windows/macOS/Linux)的Python安装方法、PyCharm专业IDE的配置使用,以及pip包管理工具的应用技巧。内容包括:Python 3.13各系统安装指南、PyCharm社区版与专业版的安装配置、环境验证方法、pip的基本命令与镜像源优化、虚拟环境管理,以及常见问题的解决方案。通过本教程,读者可获得一个高效完备的Python开发环境,为后续编程学习打下坚实基础。

nmdbbzcl的博客 1424

怀旧版电脑GBC模拟器

再现原版GBC掌机的界面,电脑运行连游戏界面都一样大小,很怀旧,很真实,(英文版)强烈推荐,很小的文件,很难才找到的。

如何通过 Docker 搭建 RabbitMQ

在当今的互联网时代,消息队列已经成为构建高效、可靠、可扩展系统的关键组件之一。RabbitMQ 作为一款功能强大且广泛使用的消息中间件,不仅支持多种消息协议,还具备高可用性、持久化、集群等特性。然而,对于初学者来说,安装和配置 RabbitMQ 可能会显得有些复杂。幸运的是,Docker 的出现极大地简化了这一过程。本文将详细介绍如何通过 Docker 快速搭建并运行 RabbitMQ,帮助你在短时间内掌握这一技能。

cda2024的博客 828

蓝牙模块HM-10手册

蓝牙模块HM-10手册,该手册对蓝牙模块HM-10进行了详细的介绍和使用方法以及一些AT指令。

Linux中快速搭建RabbitMQ

RabbitMQ是一个开源的AMQP实现,服务端用Erlang语言编写,支持多种客户端。用于在分布式系统存储转发消息,在易用性、扩展性、高可用性等方面表现不俗。RabbitMQ会绑定一些端口,安装完后,需要将这些端口添加至防火墙。4369:Erlang的端口/节点名称映射程序,用来跟踪节点名称监听地址,在集群中起到一个类似DNS的作用。:AMQP 0-9-1和1.0客户端端口,没有使用SSL和使用SSL的端口。15672。

lingbomanbu_lyl的博客 5051

霍尼韦尔SoftMaster使用说明

霍尼韦尔SoftMaster使用说明

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

rabbitmq-cluster-docker:快速搭建 RabbitMQ 集群环境

rabbitmq-cluster-docker:快速搭建 RabbitMQ 集群环境 RabbitMQ Cluster Docker 是一个开源项目,致力于帮助用户在本地设备上使用 Docker Compose 快速搭建 RabbitMQ 集群环境。本文将为您详细介绍该项目的核心功能、技术分析、应用场景和特点,让您轻松上手。 项目介绍 RabbitMQ Cluster Docker 使用官方 Ra...

gitblog_00505的博客 1113

Docker 搭建 RabbitMQ

在现代微服务与分布式架构中,RabbitMQ 是一款成熟的开源消息队列中间件,提供了可靠的消息投递、丰富的路由策略和管理插件。通过 Docker 部署 RabbitMQ,可以快速搭建、轻松扩展,并与容器化平台无缝集成。本文将指导你通过 Docker 快速搭建一个 RabbitMQ 环境,讲解目录结构、启动脚本编写、参数详解,以及两种网络模式(Host 网络模式 vs Port 映射模式)的部署示例与对比。

weixin_44876263的博客 2868

rabbitMQ快速搭建

#rabbitMQ快速搭建 【Linux】Linux下安装RabbitMQ服务 一、安装步骤 1)安装erlang yum install -y erlang 2)安装rabbitmq-server yum install -y rabbitmq-server 3)开启rabbitmq插件管理 rabbitmq-plugins enable rabbitmq_management 4)开启服务 s...

izliang的博客 292

【RabbitMQ】 RabbitMQ快速上手

RabbitMQ快速入门

2403_87459748的博客 4244
上一篇: Redis高可用总结:Redis主从复制、哨兵集群、脑裂
下一篇: RabbitMQ 补偿机制、消息幂等性解决方案
JavaShark
博客等级 码龄4年 184粉丝 438原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值