spring使用rabbitmq当rabbitmq集群节点挂掉 spring rabbitmq怎么保证高可用,rabbitmq网络怎么重新连接

##spring rabbitmq代码示例

Controller代码

import com.alibaba.fastjson.JSONObject;
import com.newland.mi.config.RabbitDMMQConfig;
import org.springframework.amqp.core.Message;
import org.springframework.amqp.core.MessageProperties;
import org.springframework.amqp.rabbit.connection.CorrelationData;
import org.springframework.amqp.rabbit.core.RabbitTemplate;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;import java.io.UnsupportedEncodingException;
import java.util.UUID;@Controller
@RequestMapping("/rabbitmq")
public class RabbitmqController {@Autowiredprivate RabbitTemplate rabbitTemplate;@RequestMapping("/getMessage")@ResponseBodypublic String getMessage() throws UnsupportedEncodingException {JSONObject obj = new JSONObject();obj.put("yym", "yym");MessageProperties messageProperties = new MessageProperties();String msgId = UUID.randomUUID().toString();rabbitTemplate.send(RabbitDMMQConfig.YYM_EXCHANGE, RabbitDMMQConfig.YYM_ROUTINGKEY, new Message(obj.toString().getBytes("UTF-8"), messageProperties), new CorrelationData(msgId));return "success";}}

RabbitmqConfig代码

import com.alibaba.fastjson.JSON;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.amqp.core.*;
import org.springframework.amqp.rabbit.connection.CachingConnectionFactory;
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;@Configuration
public class RabbitDMMQConfig {protected final static Logger log = LoggerFactory.getLogger(RabbitDMMQConfig.class);/*** Broker:它提供一种传输服务,它的角色就是维护一条从生产者到消费者的路线,保证数据能按照指定的方式进行传输,* Exchange:消息交换机,它指定消息按什么规则,路由到哪个队列。* Queue:消息的载体,每个消息都会被投到一个或多个队列。* Binding:绑定,它的作用就是把exchange和queue按照路由规则绑定起来.* Routing Key:路由关键字,exchange根据这个关键字进行消息投递。* vhost:虚拟主机,一个broker里可以有多个vhost,用作不同用户的权限分离。* Producer:消息生产者,就是投递消息的程序.* Consumer:消息消费者,就是接受消息的程序.* Channel:消息通道,在客户端的每个连接里,可建立多个channel.*/public static final String YYM_EXCHANGE = "yym-exchange";public static final String YYM_QUEUE = "yym-queue";public static final String YYM_ROUTINGKEY = "yym-routingKey";/*** 死信队列:*/public final static String deadQueueName = "ad_dead_queue";public final static String deadRoutingKey = "ad_dead_routing_key";public final static String deadExchangeName = "ad_dead_exchange";@Beanpublic Queue deadQueue() {Queue queue = new Queue(deadQueueName, true);return queue;}@Beanpublic DirectExchange deadExchange() {return new DirectExchange(deadExchangeName);}@Beanpublic Binding bindingDeadExchange(Queue deadQueue, DirectExchange deadExchange) {return BindingBuilder.bind(deadQueue).to(deadExchange).with(deadRoutingKey);}/*** 死信队列 交换机标识符*/public static final String DEAD_LETTER_QUEUE_KEY = "x-dead-letter-exchange";/*** 死信队列交换机绑定键标识符*/public static final String DEAD_LETTER_ROUTING_KEY = "x-dead-letter-routing-key";@Beanpublic ConnectionFactory yymConnectionFactory() {CachingConnectionFactory connectionFactory = new CachingConnectionFactory();connectionFactory.setAddresses("192.168.3.162:5672,192.168.3.162:5673,192.168.3.162:5674");connectionFactory.setUsername("guest");connectionFactory.setPassword("guest");connectionFactory.setConnectionTimeout(15000);connectionFactory.setVirtualHost("/");connectionFactory.setPublisherConfirms(true);connectionFactory.setPublisherReturns(true);log.info("svc dm ConnectionFactory success");return connectionFactory;}/*** 必须是prototype类型* @return*/@Beanpublic RabbitTemplate yymRabbitTemplate() {RabbitTemplate yymRabbitTemplate = new RabbitTemplate(dmConnectionFactory());yymRabbitTemplate.setMandatory(true);yymRabbitTemplate.setConfirmCallback(new RabbitTemplate.ConfirmCallback() {@Overridepublic void confirm(CorrelationData correlationData, boolean ack, String cause) {log.info("消息发送成功:correlationData({}),ack({}),cause({})", JSON.toJSONString(correlationData), ack, cause);}});yymRabbitTemplate.setReturnCallback(new RabbitTemplate.ReturnCallback() {@Overridepublic void returnedMessage(Message message, int replyCode, String replyText, String exchange, String routingKey) {log.info("消息丢失:exchange({}),route({}),replyCode({}),replyText({}),message:{}", exchange, routingKey,replyCode, replyText, new String(message.getBody()));}});log.info("RabbitTemplate success");return dmRabbitTemplate;}/*** 针对消费者配置* 1. 设置交换机类型* 2. 将队列绑定到交换机FanoutExchange: 将消息分发到所有的绑定队列,无routingkey的概念HeadersExchange :通过添加属性key-value匹配DirectExchange:按照routingkey分发到指定队列TopicExchange:多关键字匹配*/@Beanpublic DirectExchange yymDefaultExchange() {return new DirectExchange(YYM_EXCHANGE);}/*** 获取队列A* @return*/@Beanpublic Queue queueA() {// 队列持久return new Queue(YYM_QUEUE, true);}@Beanpublic Binding binding() {return BindingBuilder.bind(queueA()).to(dmDefaultExchange()).with(YYM_ROUTINGKEY);}}

##docker rabbitmq 集群

yym@yym:~$ docker ps -a
CONTAINER ID   IMAGE                                          COMMAND                  CREATED        STATUS                     PORTSNAMES
d95cd024f3c9   rabbitmq:3-management                          "docker-entrypoint.s…"   10 days ago    Up 6 hours                 4369/tcp, 5671/tcp, 15671/tcp, 15691-15692/tcp, 25672/tcp, 0.0.0.0:5674->5672/tcp, [::]:5674->5672/tcp, 0.0.0.0:15674->15672/tcp, [::]:15674->15672/tcp   rabbitmq-node3
fd35f01e8b2d   rabbitmq:3-management                          "docker-entrypoint.s…"   10 days ago    Up 26 seconds              4369/tcp, 5671/tcp, 15671/tcp, 15691-15692/tcp, 25672/tcp, 0.0.0.0:5673->5672/tcp, [::]:5673->5672/tcp, 0.0.0.0:15673->15672/tcp, [::]:15673->15672/tcp   rabbitmq-node2
83aa5e48fb3b   rabbitmq:3-management                          "docker-entrypoint.s…"   10 days ago    Up 21 minutes              4369/tcp, 5671/tcp, 0.0.0.0:5672->5672/tcp, :::5672->5672/tcp, 15671/tcp, 15691-15692/tcp, 25672/tcp, 0.0.0.0:15672->15672/tcp, :::15672->15672/tcp       rabbitmq-node1

##关闭其中一个节点

docker stop 83aa5e48fb3b

##CachingConnectionFactory监听关闭事件ShutdownListener.shutdownCompleted

@Overridepublic void shutdownCompleted(ShutdownSignalException cause) {this.closeExceptionLogger.log(logger, "Channel shutdown", cause);int protocolClassId = cause.getReason().protocolClassId();if (protocolClassId == RabbitUtils.CHANNEL_PROTOCOL_CLASS_ID_20) {getChannelListener().onShutDown(cause);}else if (protocolClassId == RabbitUtils.CONNECTION_PROTOCOL_CLASS_ID_10) {getConnectionListener().onShutDown(cause);}}

##请求controller rabbitmq/getMessage

RabbitTemplate发起请求

##connection等空,新建一个connection

 ##使用CachingConnectionFactory缓存里面的this.connection.target

  ##使用CachingConnectionFactory上次连接缓存里面的this.connection

##findOpenChannel从channelList缓存数组中清理掉channel.isOpen()是关闭的

 ##判断连接是否打开的connection.isOpen()

 ##关闭事件监听ShutdownListener.shutdownCompleted中 this.shutdownCause已经有值,所以不等空,是否打开连接为假。isOpen函数返回假。

 

 ##connection.isOpen()连接未打开,channel为空,新建一个channel

 ##createBareChannel新建channel

 ##新建createConnection连接

##连接 

##根据配置地址进行连接

 ##创建新的连接

##新连接

##使用socket创建连接

##192.168.3.162:5672节点是关闭的,创建失败

 ##循环下一个节点192.168.3.162:5673连接,直到节点可以连接

##SocketFrameHandler socket 读写流

##初始化心跳

 ##this.connection.target创建完成

## 执行mq消息发送

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/bicheng/64443.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

前端面试问题集合

0 HTML5相关 websocket WebSocket 使用ws或wss协议,Websocket是一个持久化的协议,相对于HTTP这种非持久的协议来说。WebSocket API最伟大之处在于服务器和客户端可以在给定的时间范围内的任意时刻,相互推送信息。WebSocket并不限于以Ajax(或X…

WebGPU、WebGL 和 OpenGL/Vulkan对比分析

WebGPU、WebGL 和 OpenGL/Vulkan 都是用于图形渲染和计算的图形API,但它们的设计理念、功能和适用场景有所不同。以下是它们的总结和对比分析: 1. WebGPU WebGPU 是一个新的、现代化的图形和计算API,设计目的是为Web平台提供更接近硬件的性…

RabbitMQ如何构建集群?

大家好,我是锋哥。今天分享关于【RabbitMQ如何构建集群?】面试题。希望对大家有帮助; RabbitMQ如何构建集群? 1000道 互联网大厂Java工程师 精选面试题-Java资源分享网 在RabbitMQ中,集群(Cluster&#x…

3大Excel免费功能

推荐几个免费excel图表绘制工具 Power Map Power Map是Excel的内置功能 Power Map可在Windows用户的Excel 2013或者Excel 2016或者Office 365中使用,如下图, 看案例 动态地图1 动态地图2

概率论得学习和整理31: 连续型随机变量的概率本质是求面积,均匀分布等

目录 1 连续性随机变量 2 连续性随机变量和 离散型随机变量,分布的区别 3 不要混淆概念 4 均匀分布的相关 4.1 定义 4.2 例子 1 连续性随机变量 连续性随机变量最大的特点,单个点上的概率0多了一个分布函数,因为从1维变2维了&#xff…

素数回文数的个数

素数回文数的个数 C语言代码C 代码Java代码Python代码 💐The Begin💐点点关注,收藏不迷路💐 求11到n之间(包括n),既是素数又是回文数的整数有多少个。 输入 一个大于11小于1000的整数n。 输出…

FFmpeg库之ffmpeg

文章目录 ffmpeg命令行使用基本命令选择流 -map选项 主要命令视频选项音频选项多媒体格式转换滤镜裁剪加水印画中画 录制查看可用的录制设备查看录制设备选项参数录制桌面录制窗口录制摄像头录制麦克风录制系统声音同时录制桌面和麦克风 直播推流拉流 ffmpeg命令行使用 ffmpeg…

牛客周赛 Round 72 题解

本次牛客最后一个线段树之前我也没碰到过&#xff0c;等后续复习到线段树再把那个题当例题发出来 小红的01串&#xff08;一&#xff09; 思路&#xff1a;正常模拟&#xff0c;从前往后遍历一遍去统计即可 #include<bits/stdc.h> using namespace std; #define int lo…

SKETCHPAD——允许语言模型生成中间草图,在几何、函数、图算法和游戏策略等所有数学任务中持续提高基础模型的性能

概述 论文地址&#xff1a;https://arxiv.org/pdf/2406.09403 素描是一种应用广泛的有效工具&#xff0c;包括产生创意和解决问题。由于素描能直接传达无法用语言表达的视觉和空间信息&#xff0c;因此从古代岩画到现代建筑图纸&#xff0c;素描在世界各地被用于各种用途。儿童…

SpringBoot整合druid数据源

SprintBoot默认使用的是HikariDataSource数据源&#xff0c;而且上次课中我们也说了这个数据源访问速度很快&#xff0c;但是这里还要给大家介绍一个第三方的数据源druid&#xff0c;它是阿里开发的一款开源的数据源&#xff0c;被很多人认为是Java语言中最好的数据库连接池&am…

Dubbo 3.x源码(26)—Dubbo服务引用源码(9)应用级服务发现订阅refreshServiceDiscoveryInvoker

基于Dubbo 3.1&#xff0c;详细介绍了Dubbo服务的发布与引用的源码。 此前我们学习了MigrationRuleHandler这个处理器&#xff0c;它用于通过动态更改规则来控制迁移行为。MigrationRuleListener的onrefer方法是Dubbo2.x 接口级服务发现与Dubbo3.x应用级服务发现之间迁移的关键…

Qt Creator 为同一个项目切换不同的构建套件(Kit)

如下图所示&#xff0c;我只有一个构建套件&#xff1a; 切换构建套件(Kit)的步骤如下&#xff1a; 选中上图中的步骤②后&#xff0c;可以看到如下图所示的结果&#xff0c;构建套件就已经添加成功了&#xff1a; 此时&#xff0c;我们可以自由选择使用哪一个构建套件。 如…

vue3实现商城系统详情页(前端实现)

目录 写在前面 预览 实现 图片部分 详情部分 代码 源码地址 总结 写在前面 笔者不是上一个月毕业了么&#xff1f;找工作没找到&#xff0c;准备在家躺平两个月。正好整理一下当时的毕业设计&#xff0c;是一个商城系统。还是写篇文章记录下吧 预览 商品图片切换显示…

Java深拷贝和浅拷贝区别?

大家好&#xff0c;我是锋哥。今天分享关于【Java深拷贝和浅拷贝区别?】面试题。希望对大家有帮助&#xff1b; Java深拷贝和浅拷贝区别? 1000道 互联网大厂Java工程师 精选面试题-Java资源分享网 在Java中&#xff0c;深拷贝&#xff08;Deep Copy&#xff09;和浅拷贝&am…

React 第十七节 useMemo用法详解

概述 useMemo 是React 中的一个HOOK&#xff0c;用于根据依赖在每次渲染时候缓存计算结果&#xff1b; 大白话就是&#xff0c;只有依赖项发生变化时候&#xff0c;才会重新渲染为新计算的值&#xff0c;否则就还是取原来的值&#xff0c;有点类似 vue 中的 computed 计算属性…

全国数据资源入表年度发展报告(2024)(附下载)

近日&#xff0c;在“数据要素暨第二届数据资产价值大会”上&#xff0c;青岛、潍坊、湖州、广西等地的数据资产登记评价中心&#xff0c;联合发布了《全国数据资源入表年度发展报告&#xff08;2024&#xff09;》。 报告内容包括全国数据资源入表的总体发展概述、政策指引、…

如何设置浏览器不缓存网页

设置浏览器不缓存网页可以通过多种方法实现&#xff0c;以下是一些常见的策略&#xff1a; HTTP响应头控制&#xff1a; Cache-Control&#xff1a;这是最常用的HTTP头之一&#xff0c;用于控制响应的缓存行为。例如&#xff1a; Cache-Control: no-cache, no-store, must-r…

ZZNUOJ_1341:简单密码破解(C/C++/Java)

题目描述 密码是我们生活中非常重要的东东,我们的那么一点不能说的秘密就全靠它了。哇哈哈. 接下来渊子要在密码之上再加一套密码,虽然简单但也安全。 假设渊子原来一个BBS上的密码为zvbo941987,为了方便记忆,他通过一种算法把这个密码变换成YUANzi1987,这个密码是他的…

React状态管理常见面试题目(一)

1. Redux 如何实现多个组件之间的通信?多个组件使用相同状态时如何进行管理? Redux 实现组件通信 Redux 是一个集中式的状态管理工具&#xff0c;通过共享一个全局 store 来实现多个组件之间的通信。 通信机制&#xff1a; 所有状态保存在 Redux 的全局 store 中。使用 ma…

第十六周做题总结_数据结构_AVL与哈希查找

id:157 A. DS二叉平衡树构建 题目描述 在初始为空的平衡二叉树中依次插入n个结点,请输出最终的平衡二叉树。 要求实现平衡二叉树,不可以使用各类库函数。 AVL代码参考模板: #include <iostream> using namespace std;#define LH 1 // 左高 #define EH 0 // 等高 …