昨天短信服务又宕机了,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

转载于:https://www.cnblogs.com/longzhaoyu/p/4563513.html

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

  1. Python开发系列课程(10) - 那些年我们踩过的那些坑(上)

    那些年我们踩过的那些坑 坑01 - 整数比较的坑 在 Python 中一切都是对象,整数也是对象,在比较两个整数时有两个运算符==和is,它们的区别是: is比较的是两个整数对象的id值是否相等,也就 ...

  2. 那些年我们踩过的Hive坑

    原文地址:https://blog.csdn.net/sunnyyoona/article/details/51648871 1. 缺少MySQL驱动包 1.1 问题描述 Caused by: org ...

  3. [Hive]那些年我们踩过的Hive坑

    1. 缺少MySQL驱动包 1.1 问题描述 Caused by: org.datanucleus.store.rdbms.connectionpool.DatastoreDriverNotFound ...

  4. 那些年我们踩过的一些坑之 ClickHouse

    摘要:ClickHouse 挺好用的,但是这些坑防不胜防,用过的才懂.本篇文章将持续更新... 内存限制 写数据失败 删除数据 Join 关联默认值 1.group by 使用内存限制 错误信息如下: ...

  5. 那些年我们踩过的乱码坑

    欢迎关注个人网站:http://www.iamaddy.net/2016/07/emoji-unicode-parser/ 前言 这是一个由乱码引发的故事.抱歉我暂时找不到更加惨烈的图,请相信我,还有 ...

  6. 那些年我们踩过的坑,SQL 中的空值陷阱!

    那些年我们踩过的坑,SQL 中的空值陷阱! 置顶 不剪发的Tony老师 2019-12-31 07:31:17 6737 收藏 66 分类专栏: SQL 文章标签: sql 空值 mysql orac ...

  7. 美团在Redis上踩过的一些坑-5.redis cluster遇到的一些问题

    转载请注明出处哈:http://carlosfu.iteye.com/blog/2254154 由于演讲时间有限,有关Redis-Cluster,演讲者没做太多介绍,简单的介绍了一些Redis-Clu ...

  8. python iocp_记对协程增加IOCP支持时候踩过的一些坑

    之前在对tbox的协程库中增加了基于IOCP的io处理,期间踩了不少的坑,这边就做个简单记录吧,省的到时候忘记了,自己看不懂自己这个代码 (= =) 坑点一 WSARecv/WSASend在lpNum ...

  9. (转)Redis上踩过的一些坑-美团

    上上周和同事(龙哥)参加了360组织的互联网技术训练营第三期,美团网的DBA负责人侯军伟给大家介绍了美团网在redis上踩得一些坑,讲的都是干货和坑. 分为5个部分: 一.周期性出现connect t ...

最新文章

  1. 让Redis突破内存大小的限制
  2. Ajax Get请求获取后台返回的数据
  3. Java多线程异常处理
  4. pro缺点和不足 一加7t_看点满满,一用难忘:一加7T上手体验全方位测评
  5. 智慧城市大数据分析系统解决方案
  6. matlab多元函数求导数,MATLAB多元函数导数 - 范文中心
  7. 测试技术-兼容性测试
  8. 【软件相关】EverythingSumatraPDF的一个小bug
  9. 简易水下航行器舵控arduino,蓝牙通讯
  10. 顶象App加固——助力微投证券融入IOS生态
  11. 为什么重写equals方法,还必须要重写hashcode方法
  12. 袖珍计算器c语言设计源码,Calculator 示例:Windows 窗体袖珍计算器
  13. 小米平板2 win10 MIUI互刷教程
  14. vs2010没有新建项目的解决方法
  15. jquery简单赋值取值
  16. ABB机器人基本知识。
  17. 最好用的房屋租赁软件(租赁行业)
  18. 艺赛旗(RPA) Pandas 类库基础知识
  19. 从《波斯语课》电影,思考当下紧张的形势,该如何准备面试?
  20. 摘录了个锂电\碱电的尺寸对照

热门文章

  1. 页面导航的基础与深入
  2. 巧妙算法:找出数组中消息的数字
  3. 3.STM32中对EXTI_PE5_Config()函数的理解(自定义)之中断控制按键LED
  4. C++中的覆盖(重写)、重载、隐藏(重定义)、多态!
  5. 常考数据结构与算法:表达式求值
  6. 常考数据结构与算法:最小的k个数
  7. 线程:volatile关键字
  8. 数据结构:链表面试题
  9. jquery文件的引入
  10. mycat快速体验(转)