那些年我们踩到过的坑(二):3.1 版 MultiThreadedHttpConnectionManager 未releaseConnection导致应用服务器宕机

昨天短信服务又宕机了,jstack打出线程信息发现 所有线程池的线程都在wait,栈信息如下:

at java.lang.Object.wait(Native Method)
- waiting on [0x000000070754fb60] (a org.apache.commons.httpclient.MultiThreadedHttpConnectionManager$ConnectionPool)
at org.apache.commons.httpclient.MultiThreadedHttpConnectionManager.doGetConnection(MultiThreadedHttpConnectionManager.java:518)
- locked [0x000000070754fb60] (a org.apache.commons.httpclient.MultiThreadedHttpConnectionManager$ConnectionPool)
at org.apache.commons.httpclient.MultiThreadedHttpConnectionManager.getConnectionWithTimeout(MultiThreadedHttpConnectionManager.java:416)
at org.apache.commons.httpclient.HttpMethodDirector.executeMethod(HttpMethodDirector.java:153)
at org.apache.commons.httpclient.HttpClient.executeMethod(HttpClient.java:397)
at org.apache.commons.httpclient.HttpClient.executeMethod(HttpClient.java:323)
at com.dhf.sms.util.HttpUtil.getHtml(HttpUtil.java:75)
at com.dhf.sms.core.impl.MDSmsserviceImpl.send(MDSmsserviceImpl.java:165)
at com.dhf.sms.core.SmsTask.run(SmsTask.java:156)
at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:471)
at java.util.concurrent.FutureTask.run(FutureTask.java:262)
at com.kuaidadi.framework.thread.bean.TaxiFutureTask.run(TaxiFutureTask.java:48)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615)
at java.lang.Thread.run(Thread.java:745)

发现所有线程都卡在MultiThreadedHttpConnectionManager 的doGetConnection方法:

 
   hostPool.waitingThreads.addLast(waitingThread);
                        connectionPool.waitingThreads.addLast(waitingThread);
                        connectionPool.wait(timeToWait);//卡在这

查看代码和google,发现应该是connection连接未释放的问题的。如果不调用getMethod.getResponseBodyAsString(),就不会释放connection。并且我们没有指定maxConnectionsPerHost,默认为2,所以当以下代码在第16行抛出exception后连接不会被释放掉,一旦发生两次,那么仅有的2个connection都被占用,新进来的线程就卡住了。

 1  public static String getHtml(String url,String charSet,Integer channelId) throws IOException, SmsHttpStatusException {
 2         StaticLogInfo staticLogInfo = new StaticLogInfo();
 3         staticLogInfo.setCmd("Channel "+channelId+"("+getHost(url)+")");
 4         GetMethod getMethod = null;
 5         try {
 6             if (StringUtils.isBlank(charSet)) {
 7                 charSet = SmsConstant.DEFAULT_CHARSET;
 8             }
 9
10             getMethod = new GetMethod(url);
11             int statusCode = httpClient.executeMethod(getMethod);
12             if (statusCode != HttpStatus.SC_OK
13                     && statusCode != HttpStatus.SC_MOVED_PERMANENTLY
14                     && statusCode != HttpStatus.SC_MOVED_TEMPORARILY) {
15                 log.error("statusCode:" + statusCode + " url请求失败========>" + url);
16                 throw new SmsHttpStatusException("请求失败");
17             }
18
19             String responseBody = new String(getMethod.getResponseBodyAsString().getBytes(charSet),SmsConstant.DEFAULT_CHARSET);
20             return responseBody;
21         } catch (IOException e) {
22             staticLogInfo.setResultCode("1");
23             throw e;
24         } catch (SmsHttpStatusException e) {
25             staticLogInfo.setResultCode("1");
26             throw e;
27         } finally {
28
29             reqLogger.info(staticLogInfo);
30         }
31     }
32     

解决办法是在finally里释放connection:

finally {
            if(getMethod!=null){
                getMethod.releaseConnection();
            }
            reqLogger.info(staticLogInfo);
        }

并且增加最大连接数:

httpConnectionManagerParams.setMaxTotalConnections(100);
        httpConnectionManagerParams.setDefaultMaxConnectionsPerHost(20);

参考:http://blog.csdn.net/xiaojianpitt/article/details/7818971

时间: 2024-11-07 12:19:18

那些年我们踩到过的坑(二):3.1 版 MultiThreadedHttpConnectionManager 未releaseConnection导致应用服务器宕机的相关文章

那些年我们踩到过的坑(一):为ThreadPoolExecutor 指定RejectedExecutionHandler需要注意的坑

昨天下午公司的短信发送服务挂掉,查日志发现有些短信服务提供商的服务器time out.马上联系对方,确认服务已经恢复正常,我们立马重启服务,恢复正常. 我们的短信服务是起一个线程T1从redis list去拿消息,然后创建一个发送短信的任务线程扔到线程池里执行,每一个发送短信的任务都会连接服务商的服务,time out就是从这里抛出来的,可是连接time out怎么能导致我们的服务挂掉呢? 还好当时做了thread dump,分析了下dump 文件,发现线程T1挂掉了,看代码发现该线程的run方

那些年我们踩过的坑之表单reset

开发者往往是在一个又一个的坑中成长起来的,自学的开发者尤其如此,刚刚填完一个坑,转身又掉进另一个坑.有些坑很容易就跳出来了,也有些坑能整了一天都没头绪,第二天早上一来发现后面就有一架通往坑外的梯子,坑爹啊,问题原来这么简单! 我今天就踩了一个比较坑的坑,好在花了几分钟就跳出来了.事情是这样的: 今天在做一个新增自定义假期的功能,用到了表单.页面上有个新增按钮,点击弹出一个层,里面就是表单,用的是ajax提交.当用户点击取消时(顺便吐槽一下,保存和取消按钮设计得实在是太丑了),清空表单数据,弹出层

Redis上踩过的一些坑

来自: http://blog.csdn.net//chenleixing/article/details/50530419 上上周和同事(龙哥)参加了360组织的互联网技术训练营第三期,美团网的DBA负责人侯军伟给大家介绍了美团网在redis上踩得一些坑,讲的都是干货和坑. 分为5个部分: 一. 周期性出现connect timeout 二.redis bgrewriteaof问题 三.redis内存占用飙升 四.redis内存使用优化 五.redis cluster遇到的一些问题 一.周期性

美团在Redis上踩过的一些坑-目录(本人非美团)(转)

来自:http://carlosfu.iteye.com/blog/2254154 分为5个部分: 一.周期性出现connect timeout 二.redis bgrewriteaof问题 三.redis内存占用飙升 四.redis内存使用优化 五.redis cluster遇到的一些问题 附赠PPT: (1) 本次:美团在Redis上踩过的一些坑PPT (2) 以往:<Redis在新浪的大规模运维经验>-演讲人:侯军伟新浪高级DBA.pdf 美团数据库运维平台介绍.pdf

php踩过的那些坑(4) false,NULL,0,&#39;&#39;详解

一.前方有坑 php开发过程中,难免会遇到这四个值:false,null,0,'',并且也会对这四个值进行比较,然后分别进行业务代码处理.一招不慎,就会踩到坑,影响数据判断的正确性和安全性,以至于造成代码不健壮,给程序的测试和运行造成很多的麻烦. 看如下代码: $a = NULL; $b = ''; $c = 0; $d = false; echo ($a == $b)?1:0; // 输出1 echo ($a === $b)?1:0; // 输出0 echo ($a == $c)?1:0; /

Android + Sqlite + Unity3D 踩过的那些坑 &amp; 全流程简介

全文较长,但是面面俱到的写了我遇到的很多问题,希望能帮到你 前言: 最近在弄网安实操结合的小游戏 Demo,跟老师目前讨论的是需要发布手机平台,第一步是Android平台,因为微信小程序表现不出那种真实感,所以继续用Unity3D进行开发.虽然我对unity3d有过几年的开发经验,但是没有真正接触过手机平台,都是在PC和web端.接下来是踩过的那些坑,更多的是跟sqlite相关的. 最后卡住我的问题是这个 android - Unity SQLite conection unable to op

[原创] 关于免费VPN我踩过的那些坑

关于免费VPN我踩过的那些坑 因为工作的关系,笔者经常需要用到VPN, 访问国外国网站,你懂的. 我曾经试着自己购买VPS搭建过VPN, 被封了后就没心情再维护了,毕竟直接买VPN比VPS便宜太多.时间一长,也就有了一些经验. 这里总结成表格的形式,分享给大家: [NydusVPN] 知乎推荐的香港VPN, 比直通车好,线路稳定性好,办公游戏适合.注册前7天内可以无条件退款哦.  官方网站  [Astrill] 老牌VPN,但近两年被封底得太厉害,现在已经不太给力了. 注册第一个月能免费使用(付

三分之一的程序猿之社交类app踩过的那些坑

三分之一的程序猿之社交类app踩过的那些坑 万众创新,全民创业.哪怕去年陌生人社交不管融资与否都倒闭了不知道多少家,但是依然有很多陌生人社交应用层出不穷的冒出来.各种脑洞大开,让人拍案叫起. 下面我们来挑选一些app. NO1 陌陌 陌陌为什么能火.陌陌为什么能上市,陌陌的崛起直接引领了陌生人社交的火热,后来者都称自己为“陌陌之后,下一代陌生人社交***”的称号. 像这些都项目都是想做下一个陌陌,至于为什么陌陌能成功,我会告诉你,真正的原因就是,陌陌是第一个以“约炮”为噱头的app,强占先机.其

安装python爬虫scrapy踩过的那些坑和编程外的思考

这些天应朋友的要求抓取某个论坛帖子的信息,网上搜索了一下开源的爬虫资料,看了许多对于开源爬虫的比较发现开源爬虫scrapy比较好用.但是以前一直用的java和php,对python不熟悉,于是花一天时间粗略了解了一遍python的基础知识.然后就开干了,没想到的配置一个运行环境就花了我一天时间.下面记录下安装和配置scrapy踩过的那些坑吧. 运行环境:CentOS 6.0 虚拟机 开始上来先得安装python运行环境.然而我运行了一下python命令,发现已经自带了,窃(大)喜(坑).于是go