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. 直连交换机

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

@Configurationpublic 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. 消息发送
@RestControllerpublic class SendMessageController {    @Autowired    private RabbitTemplate rabbitTemplate;    @GetMapping("/sendMessage")    public String sendMessage(){        //将消息携带路由键值        rabbitTemplate.convertAndSend("directExchange", "directRouting", "发送消息!");        return "ok";    }}

报错如下:

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

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

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

我们再来访问下
请求返回"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. 增加回调
@Beanpublic 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

或者在代码中开启

@Configurationpublic 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 Cha
RabbitMQ 高可用集群搭建 RabbitMQ 高可用集群搭建 1 集群简介 1.1 集群架构 ​ 当单台 RabbitMQ 服务器的处理消息的能力达到瓶颈时,此时可以通过 RabbitMQ 集群来进行扩展,从而达到提升吞吐量的目的。RabbitMQ 集群是一个或多个节点的逻辑分组,集群中的每个节点都是对等的,每个节点共享所有的用户,虚拟主机,队列,交换器,绑定关系,运行时参数和其他分布式状态等信息。一个高可用,负载均衡的 RabbitMQ 集群架构应类似下图: 这里对上面的集群架构做一下解释说明: ​ 首先一个基本的 Rabbi 阅读详情

相关推荐

RabbitMQ在Linux上从0到1搭建

RabbitMq在Linux上由0到1 搭建及应用

chensinanhuweiye的博客 1639

RabbitMQ工作流程详解

RabbitMQ工作流程详解

qq_38014879的博客 957

RabbitMQ原理(二):SpringAMQP编程

由于`RabbitMQ`采用了AMQP协议,因此它具备跨语言的特性。任何语言只要遵循AMQP协议收发消息,都可以与`RabbitMQ`交互。并且`RabbitMQ`官方也提供了各种不同语言的客户端。但是,RabbitMQ官方提供的Java客户端编码相对复杂,一般生产环境下我们更多会结合Spring来使用。而Spring的官方刚好基于RabbitMQ提供了这样一套消息收发的模板工具:SpringAMQP。并且还基于SpringBoot对其实现了自动装配,使用起来非常方便。

Java+GO+JS全栈工程师-鹤冲天的博客:编程辅导~商务合作~技术交流 2235

RabbitMQ流程

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

qq_44880742的博客 1139

深度学习---双层神经网络中矩阵的运算及其含义记录

深度学习---双层神经网络中矩阵的运算及其含义记录神经网络的正向传播与反向传播正向传播第一层的权重矩阵第一层的输入矩阵Z^1^ = W^1^X^1^ + b^1^A^1^ = σ(Z^1^)第二层的权重矩阵第二层的输入矩阵Z^2^ = W^2^A^1^ + b^2^反向传播dz^2^ = A^2^ - Ydw^2^ = 1/n dz^2^A^1T^db^2^ = 1/n np.sum(dz^2...

qq_43228441的博客 3748

从动态规划到最优控制:Hamilton-Jacobi-Bellman (HJB) 方程的核心思想与应用

本文深入解析了Hamilton-Jacobi-Bellman (HJB) 方程的核心思想与应用,从动态规划到最优控制的演变过程。通过实际案例展示了HJB方程在机器人路径规划、工业机械臂优化等领域的实践价值,并探讨了数值求解方法和深度学习结合的神经HJB前沿进展。

weixin_28700411的博客 458

RabbitMQ到底是怎么运行的?

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

一心同学的博客 2991

自动化测试软件设计:C# + VISA 库实现多接口(GPIB/USB)测试仪器控制

本文介绍了如何利用C#和VISA库开发支持多接口的自动化测试软件。VISA库作为标准化API,能够统一控制GPIB、USB等不同接口的测试设备。文章详细阐述了软件设计目标,包括多接口支持、统一控制、自动化脚本执行等功能。重点讲解了C#中VISA库的安装配置,并提供了设备控制类的核心代码实现,涵盖设备连接、命令发送、响应读取等关键操作。通过具体示例展示了GPIB和USB设备的连接方式,并扩展了自动化测试脚本功能。该方案具有高扩展性和维护性,适用于电子设备测试、生产线检测等多种场景,为自动化测试系统开发提供了实

这里只有干货:从 Modbus 通信到 MES 对接,从 YOLO 训练到工控机部署,带你搞定工业软件开发全流程。 1714

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

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

JavaShark的博客 114

别再手动盘点了!教你给微信小程序仓库系统加个‘扫码枪’:完整扫码入库与查询功能实现

本文详细介绍了如何为微信小程序仓库系统添加扫码入库与查询功能,实现零硬件成本的智能仓储管理。通过优化摄像头参数、增强动态识别算法和深度整合业务逻辑,提升扫码精度和效率,同时提供混合查询方案应对复杂场景。这套方案显著提升入库效率,降低错误率,适用于各类仓储管理需求。

weixin_30844577的博客 301

SAP公司间采购后台配置及前台操作详解

公司间采购后台配置及前台操作详解 SAP 实施中公司间交易几乎每个项目都会有此业务需求,比如内地很多公司都会在香港设置贸易型子公司。通过香港公司接单,然后转内地公司生产,或内地公司通过香港公司采购进口原材料,这些业务必然会涉及到公司间交易,下面我将详细说明下SAP是如何实现这种业务场景的,供大家参考。 配置前必须前台先创建公司间供应商主数据和客户主数据 1. 创建相应的客户主数据 功能说明 公司间...

weixin_40672823的博客 1万+

快速搭建完 RabbitMQ 就得用起来

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

m0_67645544的博客 556

Python学习第1天:初识Python

Python 作为目前最流行的编程语言之一,凭借其简洁优雅的语法和强大的生态系统,成为了无数开发者的首选。本系列文章将带你从零基础入门,逐步掌握 Python 编程的核心技能。今天我们先来认识 Python,并安装好开发环境。Python(英式发音:/ˈpaɪθən/;美式发音:/ˈpaɪθɑːn/)是由荷兰人吉多·范罗苏姆(Guido von Rossum)发明的一种编程语言,是目前世界上最受欢迎和拥有最多用户的编程语言。

tigerhhzz的博客 434

RabbitMQ 搭建完就得用起来

我们先来简单介绍下的工作流程:生产者往交换机中发送消息;交换机通过规则绑定队列,通过路由键将消息存储到队列中;消费者获取队列中的消息进行消费;首先创建项目 引入依赖 yml文件配置 直连交换机本项目以直连交换机为例,至于其他的交换机类型将在后文中给出详细介绍。 消息发送 我们先启动程序,在浏览器访问下http://127.0.0.1:9001/sendMessage报错如下:我们之前已经给该用户分配过权限了,如果之前未分配,直接在客户端中配置:之所以访问不到,是因为我

mrcool2012的博客 203

9、双玩家博弈中的精确与近似纳什均衡及中国股市再融资偏好研究

本文研究了双玩家博弈中精确与近似纳什均衡的计算方法,提出通过线性松弛问题LR在多项式时间内求解正则双矩阵博弈的纳什均衡,并分析其在α-平滑博弈中的近似性能。同时,探讨了中国股市2001-2009年期间再融资偏好的动态变化,重点考察非流通股改革对再融资方式选择的影响。研究表明,改革前配股为主导,改革后公开发行(含定向增发)因溢价发行和低参与门槛成为主流,显著提升了资金募集效率和市场参与度。结合博弈论模型与实证分析,揭示了制度变革对企业融资行为的深远影响。

nn3456的博客 82

优化点列图(RMS半径)的操作数

优化点列图(RMS半径)的操作数

weixin_72050316的博客 2260

详解RabbitMQ单机多节点搭建集群

详解RabbitMQ单机多节点搭建集群。

. 3462

IMSL CNL 7.0.0 (x86-64)Crack

IMSL CNL 7.0.0 (x86-64)Crack intel的算法库破解文件,这是C++版本的破解文件

RabbitMQ集群的搭建

讲解单机部署RabbitMQ集群,通过集群的搭建去理解集群思想以及集群知识的理解。

一心同学的博客 3961

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

SAP B1中文培訓教材_SDK

公司内部培训资料,对开发工具 ,DIAPI, UIAPI,Add-ON有详细解说

RabbitMQ——Docker搭建RabbitMQ集群

文章目录RabbitMQ——Docker搭建RabbitMQ集群1、普通集群的搭建1.1、普通集群架构介绍1.2、环境准备1.3、集群搭建2、镜像集群的搭建2.1、配置镜像集群的策略 RabbitMQ——Docker搭建RabbitMQ集群 集群模式介绍 RabbitMQ集群模式有两种:普通模式和镜像模式 普通模式:默认模式,多个节点组成的普通集群,消息随机发送到其中一个节点的队列上,其他节点仅保留元数据,各个节点仅有相同的元数据,即队列结构、交换器结构、交换器与队列绑定关系、vhost。消费者消费消

万里顾一程的博客 5959

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

RabbitMQ集群搭建及使用

前提条件:linux服务器下已经安装好了docker服务。本文档将搭建一个三台RabbitMQ的集群,包括三个RabbitMQ容器安装在同一服务器和三台不同的服务器。

weixin_46562226的博客 1542

CentOS系统用docker搭建rabbitMQ集群

文章目录前言一、环境准备二、部署RabbitMQ1.在机器1上安装RabbitMQ执行命令部分参数解释docker ps -a ,查看容器状态浏览器输入RabbitMQ管理地址2.在机器2上安装RabbitMQ执行命令docker ps -a ,查看容器状态浏览器输入RabbitMQ管理地址三、搭建普通集群模式1.rabbitmq1容器配置进入容器进入容器后通过rabbitmqctl命令对MQ进行操作2.rabbitmq2容器配置进入容器进入容器后通过rabbitmqctl命令对MQ进行操作四、代码测试1.

qq_27895527的博客 3103
上一篇: RabbitMQ 补偿机制的办法
下一篇: Spring事务管理和代理模式
Java_ttcd
博客等级 码龄4年 198粉丝 190原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值