生产环境ftp问题引发的血案

起因

我负责开发维护的生产系统,需要通过ftp获取银行提供的银行明细入库。最近升级后,频繁曝出ftp连接异常的问题,研究了3天总算搞明白了。

现象

生产环境ftp问题引发的血案_第1张图片
生产环境ftp问题引发的血案_第2张图片

代码介绍

升级前

生产环境ftp问题引发的血案_第3张图片

升级后

生产环境ftp问题引发的血案_第4张图片

修复后

生产环境ftp问题引发的血案_第5张图片

代码开发过程

我接手这个代码后,发现了一点,他仅仅在finally里面执行了disconnect方法,而没有执行logout方法。这样会导致,程序这边是断开了,ftp上却仍然维护着这个连接。

所以我在升级后,突出一个手贱,给他加上了logout方法。结果反而导致了生产环境的ftp一直连不上

运行展示

升级前

生产环境ftp问题引发的血案_第6张图片
生产环境ftp问题引发的血案_第7张图片
连接一个错误的ftp,两次都是没连上

升级后

生产环境ftp问题引发的血案_第8张图片
生产环境ftp问题引发的血案_第9张图片
连接一个错误的ftp,第二次连接居然返回了一个true

修复后

生产环境ftp问题引发的血案_第10张图片
生产环境ftp问题引发的血案_第11张图片
连接一个错误的ftp,两次都是没连上

升级后的版本为什么会这么诡异?

生产环境ftp问题引发的血案_第12张图片
生产环境ftp问题引发的血案_第13张图片
因为我引入了logout方法,导致finally里面,当clinet断开时,执行logout方法直接异常,反而没有执行disconnect方法。
生产环境ftp问题引发的血案_第14张图片
disconnect方法里面的__initDefaults方法负责初始化clinet的参数。而我又把client作为一个全局变量,没有初始化client参数,直接导致第二次进入代码
生产环境ftp问题引发的血案_第15张图片
connect方法,还留有上一次连接的参数,直接返回了true,没有进行连接。所以修复后把clinet作为了一个局部变量

你可能感兴趣的