[关闭]
@Mr-13 2020-08-12T00:58:34.000000Z 字数 5640 阅读 90

测试:企话通话录音上传失败

工作手机故障处理



一、问题描述:

平台: 销掌门测试平台
设备: 红米Note8(原生)
问题: 通话记录上传正常,但是通话录音一条也传不上去,出现已经超过一周;今天下午刚有时间来看


提取企话日志如下(截取部分)

  1. 2020-08-11 00:34:49.384 I/(1250)i: 需要上传录音记录数为 0
  2. 2020-08-11 00:34:49.433 I/(1250)i: 需要上传录音文件数为 47
  3. 2020-08-11 00:34:49.447 I/(1250)i: 同步完成录音文件数为 0
  4. 2020-08-11 00:34:49.458 I/(1250)i: 需要上传现场录音文件数为 0
  5. 2020-08-11 00:34:49.464 I/(1250)i: 检查上传录音地址:http://workosapi.zhonghu.cc:6680/upload/checkFile 检查上传录音参数:fileMd5=29b2fe04-5efe-4fd0-9b26-cbdf104b8743
  6. 2020-08-11 00:34:49.466 I/(1250)i: 需要上传现场录音记录数为 0
  7. 2020-08-11 00:34:49.472 I/(1250)i: 同步完成现场录音文件数为 0
  8. 2020-08-11 00:34:49.476 I/(1250)AuthUtil: 获取Token地址:http://workosapi.zhonghu.cc:6680/uaa/oauth/token 获取Token参数:grant_type=password&username=weixin&password=3b225ba61647136cf1443dbafb5a2b4d&client_secret=server&client_id=server&scope=server
  9. 2020-08-11 00:34:49.477 I/(1250)AuthUtil: 获取Token 密码MD53b225ba61647136cf1443dbafb5a2b4d
  10. 2020-08-11 00:34:50.311 I/(1250)i: 检查上传录音返回信息responseBody:{"success":true,"message":null,"state":1,"data":{"totalSize":"0","lock":"0","chunkCurr":0,"status":-1,"path":null,"fileId":null}} responseCode200
  11. 2020-08-11 00:34:50.311 I/(1250)i: ----------录音开始上传----------当前时间:2020-08-11-00-34-50
  12. 2020-08-11 00:34:50.311 I/(1250)i: 录音文件小于512KB,使用整块上传录音---size / 102436KB
  13. 2020-08-11 00:34:50.312 I/(1250)i: 整块上传录音地址:http://workosapi.zhonghu.cc:6680/upload/upload 整块上传录音信息:chunk:0,chunks:1,fileMd5:29b2fe04-5efe-4fd0-9b26-cbdf104b8743,chunkSize:524288,name:87e77e58a55cd3c47e2f6ee87b125b81.mp3,size:37248,uid:29b2fe04-5efe-4fd0-9b26-cbdf104b8743
  14. 2020-08-11 00:34:50.319 I/(1250)AuthUtil: 获取Token地址:http://workosapi.zhonghu.cc:6680/uaa/oauth/token 获取Token参数:grant_type=password&username=weixin&password=3b225ba61647136cf1443dbafb5a2b4d&client_secret=server&client_id=server&scope=server
  15. 2020-08-11 00:34:50.319 I/(1250)AuthUtil: 获取Token 密码MD53b225ba61647136cf1443dbafb5a2b4d
  16. 2020-08-11 00:34:50.404 I/(1250)AuthUtil: 请求Token ResponseCode200
  17. 2020-08-11 00:34:50.405 I/(1250)AuthUtil: 请求Token返回成功信息:{"access_token":"e371f45a-83d2-40bf-94f3-4b69a55ac72f","token_type":"bearer","refresh_token":"0985d302-89da-47f3-b8eb-9d5acb177f43","expires_in":15926,"scope":"server","companyId":6,"userId":"10","roleId":2,"departmentId":6}
  18. 2020-08-11 00:34:50.470 I/(1250)AuthUtil: 请求Token ResponseCode200
  19. 2020-08-11 00:34:50.470 I/(1250)AuthUtil: 请求Token返回成功信息:{"access_token":"e371f45a-83d2-40bf-94f3-4b69a55ac72f","token_type":"bearer","refresh_token":"0985d302-89da-47f3-b8eb-9d5acb177f43","expires_in":15926,"scope":"server","companyId":6,"userId":"10","roleId":2,"departmentId":6}
  20. 2020-08-11 00:34:50.496 I/(1250)i: 整块上传录音返回信息---response:{"timestamp":1597077290719,"status":500,"error":"Internal Server Error","exception":"org.springframework.web.multipart.MultipartException","message":"Could not parse multipart servlet request; nested exception is java.io.IOException: The temporary upload location [/tmp/tomcat.5800308774828936442.90/work/Tomcat/localhost/ROOT] is not valid","path":"/upload/upload"}---responseCode500
  21. 2020-08-11 00:34:50.496 I/(1250)i: 整块上传录音返回信息---上传录音失败-responseCode500

  关键信息如下:

  1. 2020-08-11 00:34:50.496 I/(1250)i: 整块上传录音返回信息---response:{"timestamp":1597077290719,"status":500,"error":"Internal Server Error","exception":"org.springframework.web.multipart.MultipartException","message":"Could not parse multipart servlet request; nested exception is java.io.IOException: The temporary upload location [/tmp/tomcat.5800308774828936442.90/work/Tomcat/localhost/ROOT] is not valid","path":"/upload/upload"}---responseCode500
  2. # 整理一下格式如下:
  3. Could not parse multipart servlet request;
  4. nested exception is java.io.IOException: The temporary upload location
  5. [
  6. /tmp/tomcat.5800308774828936442.90/work/Tomcat/localhost/ROOT
  7. ] is not valid

  看到这个信息有点儿懵,这个目录是干啥的?我们文件上传没用到这个目录啊,先去看一眼这个文件是否存在:
  

  还真没有,百度借鉴一下大神们的经验:
  SpringBoot文件上传异常之提示The temporary upload location xxx is not valid
  
  没耐心看的就看我不专业的继续总结吧:


二、问题分析

1、问题原因:

  上传的文件会缓存到本地磁盘,而缓存的路径就是上面的/tmp/tomcat.58******2.90/work/Tomcat/localhost/ROOT 目录;因为目录不存在(被删除了)所以导致报错。

2、为什么临时目录会不存在:

  springboot启动时会创建一个 /tmp/tomcat.*/work/Tomcat/localhost/ROOT 的临时目录作为文件上传的临时目录,但是该目录会在 n(10)天之后被系统自动清理掉,这个清理是由linux操作系统完成的,具体的配置在文件:/usr/lib/tmpfiles.d/tmp.conf ;内容如下:

  1. # This file is part of systemd.
  2. #
  3. # systemd is free software; you can redistribute it and/or modify it
  4. # under the terms of the GNU Lesser General Public License as published by
  5. # the Free Software Foundation; either version 2.1 of the License, or
  6. # (at your option) any later version.
  7. # See tmpfiles.d(5) for details
  8. # Clear tmp directories separately, to make them easier to override
  9. v /tmp 1777 root root 10d
  10. v /var/tmp 1777 root root 30d
  11. # Exclude namespace mountpoints created with PrivateTmp=yes
  12. x /tmp/systemd-private-%b-*
  13. X /tmp/systemd-private-%b-*/tmp
  14. x /var/tmp/systemd-private-%b-*
  15. X /var/tmp/systemd-private-%b-*/tmp

三、问题解决(1+4)

方法一:重启应用

  java应用重启是,会重新生成必要的缓存文件目录;如果是线上服务出现这个问题,最快速的解决办法就是重启服务;但是,指标不治本。

  就算是重启服务,也遇到了问题,这么些个服务,重启哪一个啊?
  因为是录音上传不上来,理所当然的重启了upload服务,但是,没有用!
  
  但是,在 /tmp 目录下确实生成了两个临时目录,如下图:

  生成了: tomcat.***********.6006
  缺少了: tomcat.***********.90
  
  这两个目录的命名结尾,很像……端口号?
  如果是端口号的话,那排查到是哪个服务使用了 90 端口,进行重启不就完了?试试看:
  
  先看一下端口侦听情况:

  1. $ netstat -unltp

  可以看到,进程 PID=8414,根据PID看一下具体进程信息:

  1. $ ps -ef

  呃.....!居然是gateway服务;还真是超出知识边界了。重启一下gateway服务:

  1. $ cd /data/jar
  2. $ sh boot.sh gateway stop
  3. $ sh boot.sh gateway start
  4. $ cd /tmp
  5. $ ls

  好吧,果然生成了预期格式名称的目录,
  这时候重登一下企话;通话录音顺利上传!
.
  
  


方法二:增加服务配置

  代码不是我撸的,再说也根本不会撸java;网上直接copy下来(没有验证!)

  增加服务配置,自定义baseDir

  1. server.tomcat.basedir=/tmp/tomcat

  或者在 application.yml 中增加配置:(这个办法倒是试了,临时目录还是在/tmp创建的,不知道是为啥)

  1. server
  2. tomcat:
  3. basedir: /data/temp

.
  
  


方法三:注入bean,手动配置临时目录

  仍然需要撸代码,没有验证

  1. @Bean
  2. MultipartConfigElement multipartConfigElement() {
  3. MultipartConfigFactory factory = new MultipartConfigFactory();
  4. factory.setLocation("/tmp/tomcat");
  5. return factory.createMultipartConfig();
  6. }

.
  
  
  


方法四:配置不删除tmp目录下的tomcat.*文件

  1. vim /usr/lib/tmpfiles.d/tmp.conf
  2. # 添加一行
  3. x /tmp/tomcat.*
  4. # 重启一下服务,让配置生效
  5. systemctl restart systemd-tmpfiles-clean

添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注