@Mr-13
2020-08-12T00:58:34.000000Z
字数 5640
阅读 90
工作手机故障处理
平台: 销掌门测试平台
设备: 红米Note8(原生)
问题: 通话记录上传正常,但是通话录音一条也传不上去,出现已经超过一周;今天下午刚有时间来看
提取企话日志如下(截取部分)
2020-08-11 00:34:49.384 I/(1250)i: 需要上传录音记录数为 0
2020-08-11 00:34:49.433 I/(1250)i: 需要上传录音文件数为 47
2020-08-11 00:34:49.447 I/(1250)i: 同步完成录音文件数为 0
2020-08-11 00:34:49.458 I/(1250)i: 需要上传现场录音文件数为 0
2020-08-11 00:34:49.464 I/(1250)i: 检查上传录音地址:http://workosapi.zhonghu.cc:6680/upload/checkFile 检查上传录音参数:fileMd5=29b2fe04-5efe-4fd0-9b26-cbdf104b8743
2020-08-11 00:34:49.466 I/(1250)i: 需要上传现场录音记录数为 0
2020-08-11 00:34:49.472 I/(1250)i: 同步完成现场录音文件数为 0
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
2020-08-11 00:34:49.477 I/(1250)AuthUtil: 获取Token 密码MD5:3b225ba61647136cf1443dbafb5a2b4d
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}} responseCode:200
2020-08-11 00:34:50.311 I/(1250)i: ----------录音开始上传----------当前时间:2020-08-11-00-34-50
2020-08-11 00:34:50.311 I/(1250)i: 录音文件小于512KB,使用整块上传录音---size / 1024:36KB
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
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
2020-08-11 00:34:50.319 I/(1250)AuthUtil: 获取Token 密码MD5:3b225ba61647136cf1443dbafb5a2b4d
2020-08-11 00:34:50.404 I/(1250)AuthUtil: 请求Token ResponseCode:200
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}
2020-08-11 00:34:50.470 I/(1250)AuthUtil: 请求Token ResponseCode:200
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}
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"}---responseCode:500
2020-08-11 00:34:50.496 I/(1250)i: 整块上传录音返回信息---上传录音失败-responseCode:500
关键信息如下:
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"}---responseCode:500
# 整理一下格式如下:
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
看到这个信息有点儿懵,这个目录是干啥的?我们文件上传没用到这个目录啊,先去看一眼这个文件是否存在:
还真没有,百度借鉴一下大神们的经验:
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
;内容如下:
# This file is part of systemd.
#
# systemd is free software; you can redistribute it and/or modify it
# under the terms of the GNU Lesser General Public License as published by
# the Free Software Foundation; either version 2.1 of the License, or
# (at your option) any later version.
# See tmpfiles.d(5) for details
# Clear tmp directories separately, to make them easier to override
v /tmp 1777 root root 10d
v /var/tmp 1777 root root 30d
# Exclude namespace mountpoints created with PrivateTmp=yes
x /tmp/systemd-private-%b-*
X /tmp/systemd-private-%b-*/tmp
x /var/tmp/systemd-private-%b-*
X /var/tmp/systemd-private-%b-*/tmp
方法一:重启应用
java应用重启是,会重新生成必要的缓存文件目录;如果是线上服务出现这个问题,最快速的解决办法就是重启服务;但是,指标不治本。
就算是重启服务,也遇到了问题,这么些个服务,重启哪一个啊?
因为是录音上传不上来,理所当然的重启了upload服务,但是,没有用!
但是,在 /tmp
目录下确实生成了两个临时目录,如下图:
生成了: tomcat.***********.6006
缺少了: tomcat.***********.90
这两个目录的命名结尾,很像……端口号?
如果是端口号的话,那排查到是哪个服务使用了 90
端口,进行重启不就完了?试试看:
先看一下端口侦听情况:
$ netstat -unltp
可以看到,进程 PID=8414,根据PID看一下具体进程信息:
$ ps -ef
呃.....!居然是gateway服务;还真是超出知识边界了。重启一下gateway服务:
$ cd /data/jar
$ sh boot.sh gateway stop
$ sh boot.sh gateway start
$ cd /tmp
$ ls
好吧,果然生成了预期格式名称的目录,
这时候重登一下企话;通话录音顺利上传!
.
方法二:增加服务配置
代码不是我撸的,再说也根本不会撸java;网上直接copy下来(没有验证!)
增加服务配置,自定义baseDir
server.tomcat.basedir=/tmp/tomcat
或者在 application.yml
中增加配置:(这个办法倒是试了,临时目录还是在/tmp创建的,不知道是为啥)
server:
tomcat:
basedir: /data/temp
.
方法三:注入bean,手动配置临时目录
仍然需要撸代码,没有验证
@Bean
MultipartConfigElement multipartConfigElement() {
MultipartConfigFactory factory = new MultipartConfigFactory();
factory.setLocation("/tmp/tomcat");
return factory.createMultipartConfig();
}
.
方法四:配置不删除tmp目录下的tomcat.*文件
vim /usr/lib/tmpfiles.d/tmp.conf
# 添加一行
x /tmp/tomcat.*
# 重启一下服务,让配置生效
systemctl restart systemd-tmpfiles-clean