FTP response 421 received. Server closed connection.
最近在排查一个现场问题,遇到了这么一个情况:
场景:通过定时任务(每30分钟)要从上层服务调取接口将zip下载到FTP上,
现象:下载到FTP的zip总是少东西,正常情况下,zip中应该包括:若干图片,PDF,Word,但是现场的情况是每次都少一些东西,那好吧,就看日志呗,
日志的捕捉到的异常信息是:== ftp server error ==
我又看堆栈信息,堆栈详细信息是这么写的:
Caused by: org.apache.commons.net.ftp.FTPConnectionClosedException: FTP response 421 received. Server closed connection.
at org.apache.commons.net.ftp.FTP.__getReply(FTP.java:367)
at org.apache.commons.net.ftp.FTP.__getReply(FTP.java:294)
at org.apache.commons.net.ftp.FTP.sendCommand(FTP.java:483)
at org.apache.commons.net.ftp.FTP.sendCommand(FTP.java:608)
at org.apache.commons.net.ftp.FTP.user(FTP.java:753)
at org.apache.commons.net.ftp.FTPClient.login(FTPClient.java:1034)
然后就上午查,查了很多,基本就这么两种情况:
1.Connection closed without indication.//FTP服务器服务有故障,或是是网络问题。
2. FTP response 421 received. Server closed connection.//错误原因就是FTP服务器端连接数满了
通过一周的加班排查后,终于找到问题的原因了:
自己的定时任务是这么写的* */30 * * * ?,但这个cron的表达式没秒去执行下载,导致FTP连接数过多,也就是情况2,正确写法应当是0 */30 * * * ?
不夸张,基本用了一周的时间才排查出来,下边说下我的排查的思路吧:
最开始,通过URL去下载,每次下载都没有问题,但是一调这个下载接口就少东西,于是看日志,就报这个错,定位连接数过多造成的,怎么排查,网上找命令,Linux下看看连接数多少,如果是连接数造成的,想想为什么会有这么多连接数。
起初以为是FTP在Linux装的有问题,然后就去排查对应FTP的安装配置文件,如users.properties,去查看最大相关的连接数,后来看了一下也没啥问题,但还是觉得是FTP的问题,于是我把FTP装在了Windows上,然后去连Windows上的FTP,发现竟然不报那个错了,喜出望外~,然而下载下来的东西依旧少东西,奔溃。。。
之后我又觉得可能代码里下载的时候,上层应用多线程以及线程池那块造成的,于是又去看代码…然而看了半天还是没看出问题所在,并且本地调试好也是没有问题的…最后我去请教写这块代码的人来看,看了好久,最后决定在调取这个接口的时候打一行日志,打印出调取的URL到底是什么,可发现和通过URL直接下载的一模一样,但是让人奇怪的确实日志里每次调取这个下载接口的时候,每一秒打印一次这个地址,然后看定时任务终于发现,原来是定时任务的Cron表达式写错了,定时任务我秒写的是* 0/30 * * * ? ,而不是0 0/30 * * * ?,我之前也排查过这一块,但我万万没想到,我一直以为它们都一样,怎么说呢、我知道*是任意的意思,可是,唉~怎么说呢、总之就是错了。。。