文档章节

tomcat应用拒绝服务解决过程

r
 real7
发布于 2017/04/21 14:12
字数 771
阅读 25
收藏 0

问题现象: 应用跑在tomcat上,近期遇到个问题,运行一段时间后就拒绝服务, 其他程序连接不上应用, 出问题后,tomcat和应用不记录任何日志,重启tomcat后,服务恢复。

第一次出现问题时, 根据经验判断是tomcat的线程数满了, 在服务器上查看链接数的确很多, 就修改了tomcat的最大连接数,从 400 改成 800,修改后应用持续到当天晚上21点,又挂了。

为了不影响业务,将最大连接数改成2000, 重启。 

重启后,跟踪链接使用情况,发现从该应用到JOS平台的连接居多,都是ESTABLISHED 状态,并且持续增加,由此可判断问题出在这里。这种问题的第一反应就是,程序里有没有关闭链接的地方,于是开始翻代码,结果发现应用到JOS的连接都是JOS提供的SDK处理的,看了SDK中处理链接的地方,没看出什么问题(此时的关注点还在链接是否被关闭的问题上),代码如下:

public static String doPost(String url, String ctype, byte[] content, int connectTimeout, int readTimeout) throws IOException {
    HttpURLConnection conn = null;
    OutputStream out = null;
    String rsp = null;
    try {
        conn = getConnection(new URL(url), "POST", ctype);
        conn.setConnectTimeout(connectTimeout);
        conn.setReadTimeout(readTimeout);
        out = conn.getOutputStream();
        out.write(content);
        rsp = getResponseAsString(conn);
    } finally {
        if(out != null) {
            out.close();
        }
        if(conn != null) {
            conn.disconnect();
        }
    }
    return rsp;
}

又看了N遍代码,终于发现一个线索,应用程序中初始化jos client方法是这样的:

JdClient client=new DefaultJdClient(Constant.JDURL,sessionkey,appkey,secret);

JOS sdk里的代码是这样的:

public class DefaultJdClient implements JdClient {
    ... ...
    public DefaultJdClient(String serverUrl, String accessToken, String appKey, String appSecret) {
        this.connectTimeout = 0;
        this.readTimeout = 0;
        this.serverUrl = serverUrl;
        this.accessToken = accessToken;
        this.appKey = appKey;
        this.appSecret = appSecret;
    }

    public DefaultJdClient(String serverUrl, String accessToken, String appKey, String appSecret, int connectTimeout, int readTimeout) {
        this(serverUrl, accessToken, appKey, appSecret);
        this.connectTimeout = connectTimeout;
        this.readTimeout = readTimeout;
    }
    ... ...
}

问题来了,如果程序初始化client时不指定超时时间, SDK中默认成了0, 即无穷大,虽然不能确定是不是当前遇到的问题,但这样肯定是不合理的,改了试试再说,

JdClient client=new DefaultJdClient(Constant.JDURL,sessionkey,appkey,secret, 10000, 10000);

修改后,链接数正常了, 不再持续增加, 问题解决了,但是还有两个疑问:

1、出现链接未关闭的根本原因还不清楚;

2、这个应用已经正常运行了2年了, 为嘛现在才出现问题;

看了下应用日志,发现加上超时时间后,日志里有很多这种错误:

11:31:08,352 ERROR JingDongUpdateSkuStockCmd:62 - IO异常:
com.jd.open.api.sdk.JdException: 服务器连接超时,请重试
	at com.jd.open.api.sdk.DefaultJdClient.execute(DefaultJdClient.java:103)

到此,问题就很清晰了:

近期,网络问题或者是JOS平台问题(嫌疑比较大),导致我们这边应用发出的请求得不到响应,而连接没有设置超时时间,导致程序一直走等待,占用线程数,等到线程数满了, tomcat就拒绝服务了。

 

最后甩个锅, 没有设置链接超时时间,是按照JOS平台给的代码示例写的,示例代码这么搞,坑人啊!

© 著作权归作者所有

r
粉丝 3
博文 13
码字总数 4479
作品 0
济南
程序员
私信 提问
Apache Tomcat全系再曝严重安全漏洞

  Apache Tomcat全系产品再次爆出严重的安全漏洞,其中包括2个DoS漏洞和3个信息泄露漏洞。   1. CVE-2014-0095:DoS(拒绝服务)漏洞   如果AJP请求中设置了一个长度为0的内容,会导致A...

web天空
2014/05/29
3
0
把tomcat加入到windows服务

把tomcat加入到windows服务 一、安装服务 在命令行中进入/Tomcat路径/bin/,执行“service.bat install”: 说明: 1、服务名和显示名称:service.bat中设置了默认的服务名称,不同版本分别命...

Jonson
2013/04/17
0
0
Apache Tomcat全系产品再次爆出严重的安全漏洞,赶紧升级最新版本。

尊敬的用户: 最近,Apache Tomcat全系产品再次爆出严重的安全漏洞,包括2个DoS漏洞和3个信息泄露漏洞。这些漏洞可能导致拒绝服务和信息泄露,严重影响到网站的安全。建议各位阿里云用户关注...

不朽灵都
2014/06/10
0
1
Apache Tomcat 今天再爆严重安全漏洞

Apache基金会成员Mark Thomas今天在邮件列表中公布了Tomcat中新发现的3个安全漏洞。 1. 拒绝服务漏洞(CVE-2012-4534) 等级:严重 受影响版本: Tomcat 7.0.0 ~ 7.0.27 Tomcat 6.0.0 ~ 6.0...

oschina
2012/12/05
8.5K
21
Slow HTTP Denial of Service Attack

整改建议   1.中断使用URL不支持HTTP方法访问的会话   2.限制HTTP头及包长至一个合理数值   3.设置一个绝对的会话超时时间   4.服务器支持backlog的情况下,需设置一个合理的大小  ...

疯子阳
2015/10/13
610
0

没有更多内容

加载失败,请刷新页面

加载更多

利用mybatis generator生成实体类、Mapper接口以及对应的XML文件

项目中通常会遇到数据的持久化,如果是采用mybatis的orm,就会涉及到生成xml的问题,刚好mybatis官网提供了这么个插件MyBatis Generator,效果简直是棒呆。 1. 首先需要在build.gradle文件中...

啊哈关关
今天
2
0
SpringSocial相关的知识点

使用SprigSocial开发第三方登录 核心类 ServiceProvider(AbstractOauth2ServiceProvider):主要负责实现server提供商(例如QQ,微信等共有的东西),默认实现类是AbstractOauth2ServiceProvider...

chendom
今天
2
0
Java并发之AQS详解

一、概述   谈到并发,不得不谈ReentrantLock;而谈到ReentrantLock,不得不谈AbstractQueuedSynchronizer(AQS)!   类如其名,抽象的队列式的同步器,AQS定义了一套多线程访问共享资源...

群星纪元
昨天
2
0
Fabric-sdk-java最新教程

Fabric Java SDK是Fabric区块链官方提供的用于Java应用开发的SDK,全称为Fabric-sdk-java,网上可用资料不多,本文列出了精心整理的针对Fabric Java SDK的最新精选教程。 如果希望快速掌握F...

汇智网教程
昨天
3
0
react 子组件监听props 变化

componentWillReceiveProps //已经被废弃 getDerivedStateFromProps// 推荐使用//如果条件不存在必须要返回null static getDerivedStateFromProps(props, current_stat...

一箭落旄头
昨天
3
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部