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

wordpress备份网站/广东的seo产品推广服务公司

wordpress备份网站,广东的seo产品推广服务公司,网络营销是什么时候提出的,wordpress qq空间模板首先这是一个创建zk对象的代码,通过查阅资料得知 创建过程是异步的,所以我们来一探究竟。jar版本3.4.7这段代码最后两行是重点;看下new ClientCnxn 代码前面都是参数准备,最后两行启动了两个线程;sendThread发送线程 e…

a8cd8d4849194b82ed100447cd0c1522.png

首先这是一个创建zk对象的代码,通过查阅资料得知 创建过程是异步的,所以我们来一探究竟。jar版本3.4.7

2c88da891f9c0ee266a3880c3df02e80.png

这段代码最后两行是重点;看下new ClientCnxn 代码

bf16bd156edfd33f1d4793681cac9b73.png

前面都是参数准备,最后两行启动了两个线程;

sendThread发送线程 eventThread 事件相关

因为最后cnxn.start();方法是启动两个线程,所以继续追踪两个Thread run方法,

先看sendThread。

4eb772cb6d26b6c40a48f38aa081e811.png

大致逻辑如下:

while (state.isAlive()) //判断连接是否存活 try {
if (!clientCnxnSocket.isConnected()) {clientCnxnSocket不是已经链接
if(!isFirstConnect){不是第一次连接
try {
Thread.sleep(r.nextInt(1000));休息
} catch (InterruptedException e) {LOG.warn("Unexpected exception", e);
}
}
// don't re-establish connection if we are closing
if (closing || !state.isAlive()) {如果连接失效 break
break;
} startConnect();重点开始 此处开始连接
clientCnxnSocket.updateLastSendAndHeard();
}//代码逻辑大致是 检测授权情况 发送一个授权事件,并记录时间 如果readTimeout或者connectTimeout则抛出异常
if (state.isConnected()) {
// determine whether we need to send an AuthFailed event.
if (zooKeeperSaslClient != null) {
boolean sendAuthEvent = false;
if (zooKeeperSaslClient.getSaslState() == ZooKeeperSaslClient.SaslState.INITIAL) {
try {
zooKeeperSaslClient.initialize(ClientCnxn.this);
} catch (SaslException e) {LOG.error("SASL authentication with Zookeeper Quorum member failed: " + e);
state = States.AUTH_FAILED;
sendAuthEvent = true;
}
}
KeeperState authState = zooKeeperSaslClient.getKeeperState();
if (authState != null) {
if (authState == KeeperState.AuthFailed) {
// An authentication error occurred during authentication with the Zookeeper Server.
state = States.AUTH_FAILED;
sendAuthEvent = true;
} else {
if (authState == KeeperState.SaslAuthenticated) {
sendAuthEvent = true;
}
}
}
if (sendAuthEvent == true) {
eventThread.queueEvent(new WatchedEvent(
Watcher.Event.EventType.None,
authState,null));
}
}
to = readTimeout - clientCnxnSocket.getIdleRecv();
} else {
to = connectTimeout - clientCnxnSocket.getIdleRecv();
}
if (to <= 0) {
String warnInfo;
warnInfo = "Client session timed out, have not heard from server in "
+ clientCnxnSocket.getIdleRecv()
+ "ms"
+ " for sessionid 0x"
+ Long.toHexString(sessionId);LOG.warn(warnInfo);
throw new SessionTimeoutException(warnInfo);
}

记录timeToNextPing 的时间
if (state.isConnected()) {
//1000(1 second) is to prevent race condition missing to send the second ping
//also make sure not to send too many pings when readTimeout is small
int timeToNextPing = readTimeout / 2 - clientCnxnSocket.getIdleSend() -
((clientCnxnSocket.getIdleSend() > 1000) ? 1000 : 0);
//send a ping request either time is due or no packet sent out within MAX_SEND_PING_INTERVAL
if (timeToNextPing <= 0 || clientCnxnSocket.getIdleSend() > MAX_SEND_PING_INTERVAL) {
sendPing();
clientCnxnSocket.updateLastSend();
} else {
if (timeToNextPing < to) {
to = timeToNextPing;
}
}
}


// If we are in read-only mode, seek for read/write server
if (state == States.CONNECTEDREADONLY) {
long now = System.currentTimeMillis();
int idlePingRwServer = (int) (now - lastPingRwServer);
if (idlePingRwServer >= pingRwTimeout) {
lastPingRwServer = now;
idlePingRwServer = 0;
pingRwTimeout =
Math.min(2*pingRwTimeout, maxPingRwTimeout);
pingRwServer();
}
to = Math.min(to, pingRwTimeout - idlePingRwServer);
} clientCnxnSocket.doTransport(to, pendingQueue, outgoingQueue, ClientCnxn.this);重点二
} catch (Throwable e) {//暂时忽略
if (closing) {
if (LOG.isDebugEnabled()) {
// closing so this is expectedLOG.debug("An exception was thrown while closing send thread for session 0x"
+ Long.toHexString(getSessionId())
+ " : " + e.getMessage());
}
break;
} else {
// this is ugly, you have a better way speak up
if (e instanceof SessionExpiredException) {LOG.info(e.getMessage() + ", closing socket connection");
} else if (e instanceof SessionTimeoutException) {LOG.info(e.getMessage() + RETRY_CONN_MSG);
} else if (e instanceof EndOfStreamException) {LOG.info(e.getMessage() + RETRY_CONN_MSG);
} else if (e instanceof RWServerFoundException) {LOG.info(e.getMessage());
} else {LOG.warn(
"Session 0x"
+ Long.toHexString(getSessionId())
+ " for server "
+ clientCnxnSocket.getRemoteSocketAddress()
+ ", unexpected error"
+ RETRY_CONN_MSG, e);
}
cleanup();
if (state.isAlive()) {
eventThread.queueEvent(new WatchedEvent(
Event.EventType.None,
Event.KeeperState.Disconnected,
null));
}
clientCnxnSocket.updateNow();
clientCnxnSocket.updateLastSendAndHeard();
}
}
}
cleanup();
clientCnxnSocket.close();
if (state.isAlive()) {
eventThread.queueEvent(new WatchedEvent(Event.EventType.None,
Event.KeeperState.Disconnected, null));
}
ZooTrace.logTraceMessage(LOG, ZooTrace.getTextTraceLevel(),
"SendThread exited loop for session: 0x"
+ Long.toHexString(getSessionId()));
}

跟踪startConnect()方法;

47bfe209051eb0bae26adeea16692f91.png

809f7e42407b5a92facf89ee8c667ee9.png

这里使用jdk nio的操作去连接:跟踪connect说明;

8d4fbd6b83fbd48f1d647b4f036342f9.png

大致意思如下:

如果此通道处于非阻塞模式,则对此通道的调用,方法启动非阻塞连接操作。 如果连接立即建立,就像本地连接一样,然后此方法返回<tt> true </ tt>。 否则,此方法返回 <tt> false </ tt>,稍后必须完成连接操作调用{@link #finishConnect finishConnect}方法。

如果此通道处于阻止模式,则此通道的调用方法将阻塞,直到建立连接或I / O错误发生。

既然是nio非阻塞调用,那么什么时候调用finishConnect方法呢?答案就是重点二了;

跟踪clientCnxnSocket.doTransport(to, pendingQueue, outgoingQueue, ClientCnxn.this);

342cf114f84841791124f2736a0b0b15.png

看下方法说明

e8bcfc8f0b4158c577fff360c501ab95.png

此时是判断socket是否真的连接;

之后执行sendThread.primeConnection();

最后执行outgoingQueue队列;

所以最前面的代码需要这样写;

aa4b4f81d71e4c109410d35505ffa68d.png

CountDownLatch 会防止因为网络问题连接没有生成 而去操作的异常。这也是zk创建异步的原因

http://www.lbrq.cn/news/1075933.html

相关文章:

  • 合肥做企业网站/seo推广需要多少钱
  • 网站建设出现乱码/搜索引擎优化的方法有哪些?
  • 网站建设卩金手指科杰/seo网站推广怎么做
  • 建设网站要先给钱才能做/日本进口yamawa
  • 饮品网页设计图片/合肥seo培训
  • 免费网站的软件下载/谷歌浏览器2021最新版
  • 如何做网站活动/志鸿优化网官网
  • 如何搭建自己的网站服务器地址/口碑营销的作用
  • 什么网站可以接模具做/软件推广赚钱一个10元
  • 集美建设局中心网站/培训方案模板
  • 郑州网站设计收费低/晚上国网app
  • wordpress手机图片站/seo标签怎么优化
  • 深圳做网站电话/网络优化包括
  • 枣庄建设局网站/提高搜索引擎排名
  • 品牌网站建设价位/重庆优化seo
  • 做婚纱网站的步骤/武汉最新消息今天
  • 驻马店做网站建设的公司/河北百度seo关键词
  • 龙游县建设局网站/免费发布友链
  • 深圳网站开发费用/重庆关键词自然排名
  • 聊天软件怎么做/英文seo
  • 网站做淘宝客/东莞seo网络培训
  • 北京做网站哪个好/免费推广平台排行
  • 制作企业网站页面多少钱/如何制作网站教程
  • 网站设计需要什么证/贵阳网站建设公司
  • 渭南免费做网站公司/搜索引擎优化工具有哪些
  • app网站排名/长春视频剪辑培训机构
  • 亿赐客网站/什么样的人适合做策划
  • 许昌企业网站建设公司/营销模式
  • 双鸭山网站建设企业/百度首页排名代发
  • 教做凉拌菜的视频网站/怎么做一个网站页面
  • 系统性学习数据结构-第一讲-算法复杂度
  • 【Python修仙编程】(二) Python3灵源初探(11)
  • 数字化转型驱动中小制造企业的质量管理升级
  • 【05】OpenCV C#——OpenCvSharp 图像基本操作---转灰度图、边缘提取、兴趣区域ROI,图像叠加
  • Vue 详情模块 4
  • MybatisPlus-逻辑删除