Bug描述
本机启动服务时不报错,服务间调用该方法不报错,且线上部署后启动和使用该方法均不报错。线上运行大半个月,突然看到错误日志出现错误。排查无果,遂重启服务,日志不出现报错。又运行大半个月后日志开始出现报错。报错信息如下:
运行时异常:Error while extracting response for type [class java.lang.Long] and content type [application/json];
nested exception is org.springframework.http.converter.HttpMessageNotReadableException: Invalid JSON input:
Cannot deserialize instance of `java.lang.Long` out of START_OBJECT token; nested exception is com.fasterxml.jackson.databind.exc.MismatchedInputException:
Cannot deserialize instance of `java.lang.Long` out of START_OBJECT token at [Source: (PushbackInputStream); line: 1, column: 1]
排查错误定位:
错误的起因是由于A服务调用DFS服务(文件上传服务)的上传服务时,上传服务调用失败直接运行期异常,导致返回值为空则A服务转义空位Long类型变量失败。问题的关键在于上传服务
上传服务排错
首先查看了DFS服务的日志
发现/tmp/undertow.xxx目录下不存在文件,查看服务器上/tmp目录下并无该目录,排查代码中是否含有该目录,结果并无,一时捉瞎,遂重启dfs服务,发现/tmp目录下出现一个新的文件夹,与错误日志显示文件夹类似的文件夹名称。就这样相安无事过了一段时间。
错误依旧
线上又运营了半个月并无错误日志出现,以为万事大吉。接下来又开始报警,查看错误日志依旧是之前的错误。
我自我感觉肯定是因为那个文件夹的原因,但是我并未主动创建这个文件,是程序启动后自动创建的,那为什么开始并未报错,结果运营一段时间后就被删掉了呢?
解决错误
我开始往临时文件夹想,因为/tmp是centos系统专门用来存放临时文件夹的目录嘛,那我的这个服务也是跟临时文件有关的,查阅资料,发现centos系统定时会清理tmp目录下的不常用文件夹,我福临心至,猜想很大概率是因为我服务启动后这个临时文件夹长时间未使用,被系统自动清除了,遂准备更换临时文件存放地址,在centos系统里新建一个临时文件目录,取名/data/tmp/,并在dfs服务的application.yml中添加了临时文件存放目录的配置。
servlet:
multipart:
location: /data/tmp
重启服务,到现在已经等待快1个月了,服务并未报类似错误。自此排错成功。