码迷,mamicode.com
首页 > 编程语言 > 详细

java.util.ConcurrentModificationException故障分析

时间:2018-07-19 19:17:22      阅读:187      评论:0      收藏:0      [点我收藏+]

标签:分析   idea   pcl   循环   get   syntax   use   ror   except   

  • 问题描述
    账号打通上线后发现偶尔会出现java.lang.RuntimeException: java.util.ConcurrentModificationException异常,这个是在生成请求签名的时候发生的问题,经分析应该是阿里云网关比较老版本的方法有bug。这个会导致线上用户突然掉线,体验太差。
  • 出现该Exception的根本原因
    在对Vector、ArrayList在迭代的时候如果同时对其进行修改就会抛出java.util.ConcurrentModificationException异常。
  • 解决过程
    将老的换成新的阿里云网关SDK,在修改过程中发现jar包中一个方法参数传入错误,因此暂时不采用这种方式。采用方法重试因为这并不是因为逻辑错误导致,而是框架不稳定造成的,类似的像阿里云memcache不稳定的情况也可以采用复试的方法,这样可以有效的提高用户体验。
  • 修改的关键代码

  •  

    int retry_max = 3;
    for (int i = 0; i < retry_max; i++) {
        try {
            response = Client.execute(request);
            break;
        } catch (ConcurrentModificationException exception) {
            continue;
        } catch (Exception e) {
            break;
        }
    }

    这里需要注意:idea会提示continue是不必要的,因为在循环内抛出异常会直接跳出本次循环进入下一次循环,因此并不需要写continue也可以进入下次循环,但是这写可以提高可读性,暂时保留。

     

  • 测试思路

    由于这是一个并发问题,而服务的访问量级也在10000,因此发一万次请求模仿线上环境

  • 测试代码

    for (int i = 0; i< 10000;i++){
        CloseableHttpClient httpclient = HttpClients.createDefault();
        HttpGet httpget = new HttpGet("https://r2test.mjb6.cn:8443/api/user/detail?token=1422290-EqEE4pxRvk51K9KCkZpknRC4rj7y6GMa");
        CloseableHttpResponse response = httpclient.execute(httpget);
        LOGGER.error("response="+JSON.toJSONString(response));
    }

     

 

java.util.ConcurrentModificationException故障分析

标签:分析   idea   pcl   循环   get   syntax   use   ror   except   

原文地址:https://www.cnblogs.com/xiangtingsulinlin/p/9337506.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!