当前位置: 首页 > article >正文

记一次Dubbo注册zookeeper协议时的异常提示!

遇到一个很诡异的问题我在启动多个配置相同zookeeper的Dubbo项目时其他项目都是正常启动唯独有一个项目在启动过程中Dubbo注册zookeeper协议时竟然出现了这样的异常提示——Caused by: java.lang.IllegalStateException: zookeeper not connected at org.apache.dubbo.remoting.zookeeper.curator.CuratorZookeeperClient.init(CuratorZookeeperClient.java:80) ... 79 common frames omitted我愣了一下原以为是zookeeper集群挂了然后检查了一下都正常啊奇怪的是其他系统也是正常连接为啥会有一台出现了这样的异常呢看了一下异常提示当我深入研究了一下出错的地方时才恍然明白出现这个异常究竟是为什么了。可谓是在源码面前一切都是裸泳。先来看异常提示出现的类方法CuratorZookeeperClient这个方法的作用是建立zookeeper客户端的连接类似http通信一般在建立通信前需要先建立三次握手连接同理在zookeeper客户端创建各类节点前同样需要先建立客户端连接到服务器上——public CuratorZookeeperClient(URL url) { super(url); try { int timeout url.getParameter(TIMEOUT_KEY, DEFAULT_CONNECTION_TIMEOUT_MS); int sessionExpireMs url.getParameter(ZK_SESSION_EXPIRE_KEY, DEFAULT_SESSION_TIMEOUT_MS); CuratorFrameworkFactory.Builder builder CuratorFrameworkFactory.builder() .connectString(url.getBackupAddress()) .retryPolicy(new RetryNTimes(1, 1000)) .connectionTimeoutMs(timeout) .sessionTimeoutMs(sessionExpireMs); String authority url.getAuthority(); if (authority ! null authority.length() 0) { builder builder.authorization(digest, authority.getBytes()); } client builder.build(); client.getConnectionStateListenable().addListener(new CuratorConnectionStateListener(url)); client.start(); boolean connected client.blockUntilConnected(timeout, TimeUnit.MILLISECONDS); if (!connected) { throw new IllegalStateException(zookeeper not connected); } } catch (Exception e) { throw new IllegalStateException(e.getMessage(), e); } }根据CuratorZookeeperClient方法可知出现zookeeper not connected异常提示是发生在这一段代码当中——if (!connected) { throw new IllegalStateException(zookeeper not connected); }connected表示连接状态当它的值为false时便会执行这段代码那么究竟是什么情况会导致它的值为false呢接下来让我们打一个断点一步一步解析这段代码。首先用作测试的dubbo和zookeeper配置如下——dubbo: application: name: testervice registry: address: zookeeper://120.77.217.245 # timeout: 20000 protocol: name: dubbo port: 20880解析来开始debug打断点CuratorZookeeperClient方法参数url主要包含以下信息——第一步、从url中获取超时时间timeout参数——int timeout url.getParameter(TIMEOUT_KEY, DEFAULT_CONNECTION_TIMEOUT_MS);这里的大概逻辑是如果yaml配置registry注册zookeeper部分参数当中含有 timeout话那么就返回配置当中定义的超时时间如果yaml没有进行配置那么就用默认的超时时间默认即常量DEFAULT_CONNECTION_TIMEOUT_MS值是5 * 1000也就是5秒这个参数其实就是本篇文章的核心。若自定义形式配置该参数形式如下timeout: 20000——dubbo: application: name: testervice registry: address: zookeeper://120.77.217.245 timeout: 20000第二步、获取客户端过期时间——int sessionExpireMs url.getParameter(ZK_SESSION_EXPIRE_KEY, DEFAULT_SESSION_TIMEOUT_MS);同理无自定义配置话则使用默认值DEFAULT_SESSION_TIMEOUT_MS 60 * 1000即6分钟第三步、创建一个设置过期时间为6分钟连接超时为5秒重试策略为每秒重试一次连接服务端为url.getBackupAddress()(注我这里得到的是120.77.217.245:9090即配置的zookeeper连接url)的CuratorFramework客户端实例——CuratorFrameworkFactory.Builder builder CuratorFrameworkFactory.builder() .connectString(url.getBackupAddress()) .retryPolicy(new RetryNTimes(1, 1000)) .connectionTimeoutMs(timeout) .sessionTimeoutMs(sessionExpireMs); client builder.build();第四步、添加连接状态的监控可以监控操作节点与连接情况——client.getConnectionStateListenable().addListener(new CuratorConnectionStateListener(url));第五步、开启客户端——client.start();最后一步监控客户端连接情况若能连接成功则证明创建客户端成功反之失败。可见若出现zookeeper not connected问题就在于客户端连接过程是失败的至于为何失败原理就在client.blockUntilConnected(timeout, TimeUnit.MILLISECONDS)代码里。boolean connected client.blockUntilConnected(timeout, TimeUnit.MILLISECONDS); if (!connected) { throw new IllegalStateException(zookeeper not connected); }进入到 client.blockUntilConnected(timeout, TimeUnit.MILLISECONDS)源码里这里的maxWaitTime即前边的timeout默认值是5秒大概分析一下下边代码——public synchronized boolean blockUntilConnected(int maxWaitTime, TimeUnit units) throws InterruptedException { //获取当前时间 long startTime System.currentTimeMillis(); //这里是true boolean hasMaxWait (units ! null); //maxWaitTimeMs等于5000毫秒即5秒 long maxWaitTimeMs hasMaxWait ? TimeUnit.MILLISECONDS.convert(maxWaitTime, units) : 0; while ( !isConnected() ) { //hasMaxWait为true if ( hasMaxWait ) { //倒数5秒 long waitTime maxWaitTimeMs - (System.currentTimeMillis() - startTime); //执行到这里已经过去5秒话就执行以下方法返回isConnected()值 if ( waitTime 0 ) { return isConnected(); } //还没到5秒话假如执行到这里还有3秒那么就会执行Object.wait(long timeout)方法即该线程阻塞3秒后再自动唤醒接着继续执行 wait(waitTime); } else { wait(); } } return isConnected(); }该方法的核心会等待maxWaitTime时间时间一到就会返回isConnected()值这里其实很好理解就是客户端发起连接后这里用一个while循环来等待指定的超时时间默认是5秒若5秒过了就返回isConnected()值而这里的isConnected()就是验证是否连接成功了那么这里就剩最后一个答案了isConnected()是什么public synchronized boolean isConnected(){ return (currentConnectionState ! null) currentConnectionState.isConnected(); }这里应该是判断客户端连接状态即在client.start()方法里会有一个状态若创建连接成功那么currentConnectionState.isConnected()就能得到true值这里更像是一个观察模式观察指定的连接超时时间内是否连接成功。根据debug发现未连接成功时值是null得到的即为false当我们把默认为5秒的连接超时设置为timeout: 20000等待连接过程发现连接成功了返回currentConnectionState的值为RECONNECTED。可见之前出现zookeeper not connected异常问题就是连接超时设置太短了currentConnectionState.isConnected()得到的是一个枚举值RECONNECTED返回的是true——CONNECTED { public boolean isConnected() { return true; } }, SUSPENDED { public boolean isConnected() { return false; } }, RECONNECTED { public boolean isConnected() { return true; } }, LOST { public boolean isConnected() { return false; } }, READ_ONLY { public boolean isConnected() { return true; } };当返回true话那么!connected就为false就不会执行以下异常提示了——if (!connected) { throw new IllegalStateException(zookeeper not connected); }根据上边分析可见启动Dubbo项目注册Zookeeper时提示zookeeper not connected异常是因为没有在配置里设置连接超时而是使用了默认的5秒导致5秒内没有成功连接就出现连接异常而无法成功连接当调长时间后就正常连接成功了同时也说明了这次本地连接zookeeper集群的时间超过了五秒。

相关文章:

记一次Dubbo注册zookeeper协议时的异常提示!

遇到一个很诡异的问题,我在启动多个配置相同zookeeper的Dubbo项目时,其他项目都是正常启动,唯独有一个项目在启动过程中,Dubbo注册zookeeper协议时,竟然出现了这样的异常提示——Caused by: java.lang.IllegalStateExc…...

如何5分钟搞定魔兽争霸3性能优化:WarcraftHelper终极完整指南

如何5分钟搞定魔兽争霸3性能优化:WarcraftHelper终极完整指南 【免费下载链接】WarcraftHelper Warcraft III Helper , support 1.20e, 1.24e, 1.26a, 1.27a, 1.27b 项目地址: https://gitcode.com/gh_mirrors/wa/WarcraftHelper 还在为魔兽争霸3的60帧限制而…...

让你的Windows任务栏焕然一新:TranslucentTB透明化美化全攻略

让你的Windows任务栏焕然一新:TranslucentTB透明化美化全攻略 【免费下载链接】TranslucentTB A lightweight utility that makes the Windows taskbar translucent/transparent. 项目地址: https://gitcode.com/gh_mirrors/tr/TranslucentTB 你是否厌倦了Wi…...

STM32+ESP8266项目复盘:我的温室监控系统踩了哪些坑?

STM32ESP8266温室监控系统实战复盘:从硬件选型到云上传的避坑指南 去年夏天,我接手了一个智能温室监控系统的开发项目。客户要求实时监测温湿度、土壤墒情、光照和CO2浓度,并通过WiFi上传到云端。听起来像是典型的物联网应用,但实…...

终极雀魂AI助手:5分钟快速上手指南

终极雀魂AI助手:5分钟快速上手指南 【免费下载链接】Akagi 支持雀魂、天鳳、麻雀一番街、天月麻將,能夠使用自定義的AI模型實時分析對局並給出建議,內建Mortal AI作為示例。 Supports Majsoul, Tenhou, Riichi City, Amatsuki, with the abil…...

终极隐私保护!Windows本地实时语音转文字工具全攻略

终极隐私保护!Windows本地实时语音转文字工具全攻略 【免费下载链接】TMSpeech 腾讯会议摸鱼工具 项目地址: https://gitcode.com/gh_mirrors/tm/TMSpeech 你是否在寻找一款完全免费、数据永不离开本地的实时语音转文字工具?TMSpeech正是你需要的…...

FanControl终极指南:让你的Windows风扇控制完全智能化

FanControl终极指南:让你的Windows风扇控制完全智能化 【免费下载链接】FanControl.Releases This is the release repository for Fan Control, a highly customizable fan controlling software for Windows. 项目地址: https://gitcode.com/GitHub_Trending/fa…...

3步掌握G-Helper:华硕笔记本性能控制的终极指南

3步掌握G-Helper:华硕笔记本性能控制的终极指南 【免费下载链接】g-helper Lightweight, open-source control tool for ASUS laptops and ROG Ally. Manage performance modes, fans, GPU, battery, and RGB lighting across Zephyrus, Flow, TUF, Strix, Scar, an…...

基于Git的个人加密仓库wall-vault:安全备份与跨设备同步方案

1. 项目概述与核心价值最近在整理个人数字资产时,我遇到了一个很多朋友都有的痛点:那些零散但重要的文件——比如证件扫描件、合同电子版、软件授权码、家庭照片备份,还有各种平台的账号密码——到底该怎么存才既安全又方便?放网盘…...

咱这“铁疙瘩”咋干活?——老李师傅唠唠物料搬运机器人

哎,小张啊,过来过来!天天看那铁疙瘩在车间里转悠,是不是心里直痒痒,想知道这玩意儿到底咋回事?师傅我今天没啥事,给你好好掰扯掰扯这物料搬运机器人。来,先泡壶茶,咱边喝…...

IOI竞赛中的测试时计算扩展优化策略

1. 项目背景与目标拆解这个标题直指国际信息学奥林匹克竞赛(IOI)备赛中的核心痛点——如何在有限时间内通过优化测试阶段计算资源分配来提升竞赛成绩。作为参加过三届IOI的选手,我深刻理解赛场上每秒的计算时间都价值连城。2023年IOI金牌分数…...

Copilot Next 工作流为何在生产环境突然降智?深度解析LLM上下文截断阈值、Token泄漏风险与4种加固方案

更多请点击: https://intelliparadigm.com 第一章:Copilot Next 工作流在生产环境突发降智现象概览 近期多个中大型团队反馈,Copilot Next 在接入 CI/CD 流水线后出现非预期的语义退化行为:代码补全准确率下降 37%(基…...

CCS11实战:手把手教你为DSP工程配置RAM与FLASH双启动(附完整cmd文件处理流程)

CCS11实战:DSP工程RAM与FLASH双启动配置全解析 在嵌入式开发领域,TI的DSP处理器因其强大的数字信号处理能力而广受欢迎。但对于刚接触CCS开发环境的新手来说,如何正确配置工程以实现RAM调试与FLASH发布的灵活切换,往往成为第一个需…...

RPG Maker Decrypter:终极游戏资源解密工具完整指南

RPG Maker Decrypter:终极游戏资源解密工具完整指南 【免费下载链接】RPGMakerDecrypter Tool for decrypting and extracting RPG Maker XP, VX and VX Ace encrypted archives and MV and MZ encrypted files. 项目地址: https://gitcode.com/gh_mirrors/rp/RPG…...

别再手动敲数据了!用Vue+Element UI的el-table实现Excel粘贴导入(附完整代码)

零代码实现Excel数据秒导入:VueElement UI表格粘贴黑科技 每次从Excel往系统里录入数据时,你是不是还在重复着"复制→切换窗口→粘贴→调整格式"的机械操作?我们团队最近重构了一个CRM系统,销售部门每天要处理上千条客户…...

别再乱选求解器了!CST MWS 2021版6大求解器保姆级选择指南(附应用场景)

CST MWS 2021求解器选择全攻略:从原理到实战的黄金法则 在电磁仿真领域,CST Microwave Studio(MWS)就像一位拥有六把不同钥匙的开锁专家——每把钥匙(求解器)对应特定类型的锁(电磁问题&#xf…...

基于并行计算优化的压缩包密码恢复算法架构设计

基于并行计算优化的压缩包密码恢复算法架构设计 【免费下载链接】ArchivePasswordTestTool 利用7zip测试压缩包的功能 对加密压缩包进行自动化测试密码 项目地址: https://gitcode.com/gh_mirrors/ar/ArchivePasswordTestTool 在数字资产安全管理领域,加密压…...

G-Helper革命性指南:轻松掌控华硕笔记本性能的完整解决方案

G-Helper革命性指南:轻松掌控华硕笔记本性能的完整解决方案 【免费下载链接】g-helper Lightweight, open-source control tool for ASUS laptops and ROG Ally. Manage performance modes, fans, GPU, battery, and RGB lighting across Zephyrus, Flow, TUF, Stri…...

Chinese-LLaMA-Alpaca:开源大语言模型的中文优化与本地部署实战

1. 项目概述:当大语言模型说中文如果你在2023年初尝试过用开源的大语言模型(LLM)处理中文任务,大概率会感到一丝沮丧。无论是Meta开源的LLaMA,还是后续的Alpaca,它们在英文世界表现出色,但面对中…...

AI 写论文哪个软件最好?2026 实测:虎贲等考 AI 凭真文献 + 真图表 + 全流程实证,稳坐毕业论文首选

每到毕业季,“AI 写论文哪个软件最好” 成为无数本硕博学生最纠结的问题。市面上 AI 写作工具看似丰富,却普遍存在虚构文献、无实证图表、AI 痕迹重、功能碎片化、不合规五大硬伤,轻则反复返修,重则触碰学术诚信红线。 经过对当前…...

别再只盯着激光雷达了!视觉+红外融合方案,低成本实现机器人精准自主充电

视觉与红外融合:低成本机器人自主充电系统的实战设计 当扫地机器人在电量耗尽前总能精准返回充电座时,这种看似简单的行为背后其实隐藏着复杂的多传感器融合技术。传统方案依赖激光雷达实现高精度定位,但成本往往超过中小型团队的预算上限。实…...

别再死记硬背了!用程序员能懂的方式,图解GNSS里的‘历书’、‘星历’和‘模糊值’

程序员视角下的GNSS核心概念:用技术黑话拆解定位原理 全球导航卫星系统(GNSS)就像一套分布式的空间数据库,而你的设备则是一个不断发起查询的客户端。理解这套系统的底层逻辑,对于开发高精度定位应用至关重要。想象一下…...

2026年VR交互式展示深度测评:郑州这4家权威推荐避坑指南!

《2026年华中地区企业数字化营销与VR技术应用市场调研报告》数据显示,超过67%的制造企业与地产开发商在寻找VR交互式展示服务商时,因信息不对称而遭遇“视觉落差”或“预算超支”。市场上充斥着炫技噱头,却鲜有服务商能真正理解“设备VR交互式…...

华硕笔记本终极性能优化指南:G-Helper开源控制工具完全手册

华硕笔记本终极性能优化指南:G-Helper开源控制工具完全手册 【免费下载链接】g-helper Lightweight, open-source control tool for ASUS laptops and ROG Ally. Manage performance modes, fans, GPU, battery, and RGB lighting across Zephyrus, Flow, TUF, Stri…...

VMware macOS解锁器:在非苹果硬件上运行macOS虚拟机的完整指南

VMware macOS解锁器:在非苹果硬件上运行macOS虚拟机的完整指南 【免费下载链接】unlocker VMware Workstation macOS 项目地址: https://gitcode.com/gh_mirrors/unloc/unlocker 你是否曾经希望在Windows或Linux系统上运行macOS虚拟机,却因为VMw…...

从创意到实物:Blender 3MF插件让你的3D打印工作流更完整

从创意到实物:Blender 3MF插件让你的3D打印工作流更完整 【免费下载链接】Blender3mfFormat Blender add-on to import/export 3MF files 项目地址: https://gitcode.com/gh_mirrors/bl/Blender3mfFormat 在当今数字制造时代,3D打印已经成为创意实…...

华硕笔记本终极性能控制指南:用G-Helper解锁完整硬件潜能

华硕笔记本终极性能控制指南:用G-Helper解锁完整硬件潜能 【免费下载链接】g-helper Lightweight, open-source control tool for ASUS laptops and ROG Ally. Manage performance modes, fans, GPU, battery, and RGB lighting across Zephyrus, Flow, TUF, Strix,…...

RPG-Encoder:重构代码理解范式的双重视图技术

1. 项目概述:RPG-Encoder如何重构代码理解范式在当今的软件开发实践中,我们常常面临一个根本性矛盾:代码库的规模与复杂性呈指数级增长,而开发者的认知带宽却基本保持不变。传统代码理解工具如API文档和依赖图,就像试图…...

考场信号屏蔽器分布式天馈系统手机信号屏蔽器

在当今信息时代,保障特定场所的信息安全至关重要。中科星月的分布式信号屏蔽器,凭借其卓越性能,成为众多场所的理想选择。多场景适用,解决信号屏蔽难题中科星月的分布式信号屏蔽器可屏蔽 2.3.4.5G 手机信号,适用于军营…...

Docker AI Toolkit 2026性能实测报告(GPU利用率飙升至92.6%!):NVIDIA H100集群调优黄金参数首次公开

更多请点击: https://intelliparadigm.com 第一章:Docker AI Toolkit 2026核心架构演进与版本定位 Docker AI Toolkit 2026标志着容器化AI工作流从“可运行”迈向“可推理、可验证、可编排”的关键分水岭。其核心不再仅封装模型服务,而是构建…...