前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >学艺不精引发的血案

学艺不精引发的血案

作者头像
Coder的技术之路
发布2021-05-14 14:16:38
2320
发布2021-05-14 14:16:38
举报
文章被收录于专栏:Coder的技术之路

哈 如我所愿,你们还是被标题吸引进来了。论标题的重要性

今天有个线上小bug,是由zookeeper初始化引起的,把查找修复过程记录一下,其实和zookeeper没多大关系,还是并发的事情,不感兴趣的兄弟们可以撤了,O(∩_∩)O

我的程序中,连接了zk,来做一些分布式通知和逻辑控制的事情,用了别人封装的客户端,来注册、监听、获取通知、响应对应逻辑。

但是,spring启动加载时,报了个错,幸亏发现了

zookeeper is not initialized.... 什么鬼。。。

zk注册失败,就意味着依赖zk的控制逻辑都会时效,比如动态日志级别切换什么的,得找出原因呐。。。

首先找到了spring 配置文件中的zk客户端

可以看到,根据zk服务器地址,节点路径,在init方法中进行了初始化,(这里的同步逻辑设置成了false),而false的含义是要在init时,重新启动一个线程,去做初始化的工作(炸弹。。。)

接下来是注册节点和监听器的操作类。

这里,用配置的形式,将上面的zkClient添加到这个类的属性中,然后再在init方法中,对将会用到的监听器进行注册

这时候,问题就来了,当调用super的注册方法时,会用到此类中的属性zkClient,但是zkClient此时真的已经初始化好了么,不一定啊!

因为我们设置的sync 是false,只是将初始化的工作交出去了,完成没有,真心不知道啊,所以,一旦没有初始化完成,就使用它去进行注册,一定会抛出异常。

是不是很熟悉的错误,在前面的volatile文章中就提到过“类的安全发布”,很显然,这时候的zkClient类的发布,是不安全的


怎么解决呢,一个方法是把sync设置成true,同步模式,注册完再说别的。

第二个办法呢,就是弃用配置的形式注入zkClient,改成

注解形式,并设置成线程可见。


本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2017-07-25,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 Coder的技术之路 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档