• java.util.ConcurrentModificationException故障分析


    • 问题描述
      账号打通上线后发现偶尔会出现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_后端面经_5
    头条后端面经_1面
    面试java后端面经_2
    java后端开发面经 数据库相关
    用友java后端开发面经
    面试java后端面经_4
    维恩贝特面试JAVA后台开发
    面试java后端面经_3
    世纪龙校招java开发一、二面 面经
    AndroidWebView使用
  • 原文地址:https://www.cnblogs.com/xiangtingsulinlin/p/9337506.html
Copyright © 2020-2023  润新知