深圳Java培训
达内深圳宝安中心

136-3244-2201

热门课程

【达内JAVA学院】Java中的PoLA 法则

  • 时间:2016-03-29
  • 发布:深圳Java培训
  • 来源:达内新闻

如果你和我一样也是开发者的话,你很可能已经听说过“PoLA”原则,或者叫作“产生最少意外”原则。意思非常简单,就是不要让你的用户感到惊讶。 或者更明确一些,就像本文这种情况,不要让另外一个开发者感到惊讶。不幸的是,我上个星期就遇到了大大超出我意外的事情,我们有个服务的客户调用端总是发 出一些垃圾的请求。

【达内JAVA学院】Java中的PoLA 法则

你说垃圾请求吗?是的,就像这样,我们完全不清楚这些请求是从哪里来的。又是这样一个时刻,经理们毫无头绪,抱头乱窜,惊呼“我们肯定是被黑客攻击了”,或者 ”有人把防火墙给关掉了!!”

无论如何,先说点背景情况吧,我们的项目里有自动记录活动日志的功能,当某些情况下,比如一个进程启动的时候就会进行记录。这包括我们那出问题的网 络服务客户端和服务端,因为它们两者都属于系统的一部分。在某些时候,我们注意到,服务端的响应还没有发出的时候,另外一个来自同样客户端的请求又发了过 来。这个真是出乎意料的,因为客户端代码是单线程的,也没有其他的客户端掺和进来。审查代码、测试之后,结论是我们的客户端不可能在第一个请求还没结束的 时候再同时发出另外一个。

经过一整天的调试和研究日志发现,事实上,在服务端处理还未结束的时候客户端其实已经断开连接了。所以,这些请求终究并不是同时发生的,但是为什么我们花了一整天的时间才发现呢?这跟我们玩了一整天的星球大战有啥区别?

好吧,其实也不是。我们发现了罪魁祸首,服务端的容器软件HTTP的读超时设置被调得太低了。服务端的日志显示的确生成了响应,但是客户端却在此之 前已经断开了,因为服务器端发生了读超时。这些在服务器端当然没有日志记录,因为这种行为是更低一层协议决定的(HTTP栈),而不是服务端的应用代码。

是的,没错,我听明白了,但是客户端的日志该怎么解释?客户端是不是应该抛出一个“ReadTimeoutException”异常,或者类似的玩 意,然后可以写到日志里?然而,没错,事实上,并没有。就像现在发现的一样,真正的意外来自HttpURLConnection类的内部。

你以前是否知道HttpURLConnection的默认实现有个在某些情形下自动重试的特性?好吧,我之前就不知道。当时的情况是,客户端的确触 发了超时异常,但是却被HttpURLConnection给捕捉了,而它自己决定重新尝试一次。这就意味着,你调用了 HttpURLConnection的read()方法,它阻塞了,你正在等待,看起来就好像是在等待第一次请求的响应一样。但是在 HttpURLConnection内部,它作了不止一次尝试,因此创建了不止一个socket连接。这就解释了为什么第二次及以后的请求永远在日志里找 不到,因为这些第二次之后的请求是HttpURLConnection内部发起的。

我们是一群热爱IT的年轻人,如果你也爱IT、爱JAVA开发,欢迎前来达内深圳JAVA培训中心参观学习,让我们共同为梦想发声。

更多JAVA培训、JAVA就业、JAVA薪资、JAVA教程等内容,请访问达内深圳JAVA培训官方网站!众多资深JAVA大神级讲师为您答疑解惑!

“我们不生产技术,而是教育的传授者,更是it技术的搬运工。”

上一篇:JAVA就业前景|深圳java培训机构招生火爆
下一篇:Java 网络服务开发框架 Netty 4.1.0.CR5

预计发布的Java 9中,很令人期待的是什么?

【深圳JAVA培训】世界十类很急需IT人才

JAVA——很吃香的编程语言

为什么程序员是很有钱的一批人?

选择城市和中心
贵州省

广西省

海南省