20160229日某农商行因为FTP下载功能有问题,导致当天所有涉及FTP文件下载的交易都不能正常使用,对于银行来说影响还是比较大。现将当天出问题的原因及处理过程解析如下,忘能给碰到类似问题的同行以供参考。

当天早上一上班就接到电话有人说信贷系统很多交易用不了,查看日志都是报的找不到文件,无法解析。

后经过多方人员的共同努力查找和排查,最终确认是ReceiveFileTransfer.java类中的transfer()方法调用Apache组件commons-net-1.4.1.jar的listFiles时返回空问题引起,结合网上结论推断原因是目标服务器的中文语言环境,导致文件的修改日期格式,不能被apache正确解析造成的。(2月29)

问题原因是定位到了,当务之急是如何快速让生产环境恢复正常运行,而不影响日常业务开展。

经过多方讨论共提供三种解决方案:

1、将目标服务器中当天使用频繁的交易所生成的文件临时改到20160228目录下;

2、根据网上处理经验替换commons-net-1.4.1.jar包中的两个文件(FTPTimestampParserImplExZH.class、UnixFTPEntryParser.class)

3、第2点的变向处理,不改jar包,使用时动态选择解析类;

以上三种方案,当时先用第1种解决燃眉之急,以保证重要交易能正常使用;第2种考虑还是会存在一定风险,因为该系统使用年数比较旧,jdk版本也比较底,直接修改jar中的内容,一时无法保证对其它功能没有影响;所以最后的永久处理方案还是选择了第3点。下面就针对这种解决方案做以下详述:

以下是代码跟踪步骤及解决方法:

1)        由以下代码可知,FTP下载前会检查listFiles()所得到的fileList.size()是否大于0,只有大家于0的时候才会调附件下载的方法。

 

2)        通过反编译commons-net-1.4.1.jar代码可知,listFiles()方法调用的是jar中FTPClient.class类的对应方法。(也可以去官网下载源码)

  
 
 

3)        再往下追踪可知,FTPListParseEngine.class这个解析引擎类会针对不同系统创建不同的解析工厂。

 

"([bcdlfmpSs-])(((r|-)(w|-)([xsStTL-]))((r|-)(w|-)([xsStTL-]))((r|-)(w|-)([xsStTL-])))\\+?\\s+(\\d+)\\s+(\\S+)\\s+(?:(\\S+)\\s+)?(\\d+)\\s+((?:\\d+[-/]\\d+[-/]\\d+)|(?:\\S+\\s+\\S+))\\s+(\\d+(?::\\d+)?)\\s+(\\S*)(\\s*.*)"

以上正则表达式串,正是为了匹配unix类系统的文件目录结构,但存在bug

-rw-r--r--    1 root     system            0 Feb 29 16:19 ECDS_4017692698500000382783.txt

4)        根据网上建议对该解析类的正则表达式进行优化,但直接反编译jar包中源代码不可取,会存在风险;所以采用了类似对该解析类重写的方式处理,首先在EOS的以下目录增加两个java文件。

 

将UnixFTPEntryParser中正表达式进行优化

 

5)        再在调用listFiles()方法之前先让该方法的解析类指向新加的解析类,代码如下:

 

6)        为了对该功能的影响降到最底,故对代码又做了特殊处理,只有2月29的情况才调用新加的解析类,其它日期还是延用之前的代码。

 

7)        为此完成所有改动点总共涉及5个java文件,打包到测试1和测试3初步验证无问(延用了他原来的工厂类模式)。

 

FTP服务器中文环境引起润日下载不了附件问题解析的更多相关文章

  1. [java] java 实现FTP服务器文件的上传和下载

    利用Apache commons-net 实现: package com.xwolf.driver.util; import com.xwolf.driver.exception.RunExcepti ...

  2. FTP服务器 Serv-u 环境搭建

    一.安装 *Windows 10 *Serv-u Windows-v15.1.2 *Mysql Mysql 5.7 安装成功后开始配置serv-u. 二.配置 1.新建域(test) 点击新建域,开始 ...

  3. java代码实现ftp服务器的文件上传和下载

    java代码实现文件上传到ftp服务器: 1:ftp服务器安装: 2:ftp服务器的配置: 启动成功: 2:客户端:代码实现文件的上传与下载: 1:依赖jar包: 2:sftpTools   工具类: ...

  4. 通过JAVA对FTP服务器连接,上传,下载,读取,移动文件等

    记录一次对FTP服务器文件内容 通过Java程序对FTP服务器文件处理:连接,上传,下载,读取,移动文件等. 需求描述:今天接到一个任务,在Java项目中,读取FTP服务器上的一些文件,进行一些业务操 ...

  5. FTP服务器搭建以及上传下载的学习

    首先需要搭建FTP服务步骤如下: 1.在win7上先开启ftp服务:这里点击确定后,可能会要等一会儿,完成后有时系统会提示重启 2.打开   计算机-->管理-->   在这里我们可以看见 ...

  6. 使用批处理文件在FTP服务器 上传下载文件

    1.从ftp服务器根目录文件夹下的文件到指定的文件夹下 格式:ftp -s:[配置文件] [ftp地址] 如:ftp -s:c:\vc\ftpconfig.txt   192.168.1.1 建立一个 ...

  7. Linux FTP服务器搭建与使用

    一.vsftpd说明 LINUX下实现FTP服务的软件很多,最常见的有vsftpd,Wu-ftpd和Proftp等.Red Hat Enterprise Linux中默认安装的是vsftpd. 访问F ...

  8. Linux学习笔记之十————Linux常用服务器构建之ftp服务器

    p服务器介绍 FTP 是File Transfer Protocol(文件传输协议)的英文简称,而中文简称为“文传协议”. 用于Internet上的控制文件的双向传输. 同时,它也是一个应用程序(Ap ...

  9. win7下如何建立ftp服务器

    前段时间正在做一个项目,需要上传东西到ftp服务器,纠结于如何建立ftp服务器.经过一番摸索.终于成功建立ftp服务器.现将我的经验跟大家分享一下.不足之处还望多多指点! 步骤/方法 首先在本地机器上 ...

随机推荐

  1. CentOS 5.4下的Memcache安装步骤(Linux+Nginx+PHP+Memcached)

    原文链接:http://www.jb51.net/article/29668.htm

  2. Deep Learning 学习随记(五)Deep network 深度网络

    这一个多周忙别的事去了,忙完了,接着看讲义~ 这章讲的是深度网络(Deep Network).前面讲了自学习网络,通过稀疏自编码和一个logistic回归或者softmax回归连接,显然是3层的.而这 ...

  3. 【转】 CoreGraphics QuartzCore CGContextTranslateCTM 用法

    原文:http://blog.csdn.net/sqc3375177/article/details/25708447 CoreGraphics.h 一些常用旋转常量 #define M_E 2.71 ...

  4. java操作excel常用的两种方式

    Excel是我们平时工作中比较常用的用于存储二维表数据的,JAVA也可以直接对Excel进行操作,在这篇博客中将为大家介绍两种操作Excel的方式,分别为:jxl和poi. 对于两者的区别网上有测试如 ...

  5. 英语学习[ZZ]

    本文作者三年间从四级勉强及格到高级口译笔试210,口试232.找工作面试时给其口试的老外考官听了一分钟就说你的英语不用考了.虽不敢说方法一定是最好的,但从现在开始随便谁不要再去找学习资料,每天花两个钟 ...

  6. Linux抓包工具tcpdump详解

    tcpdump是一个用于截取网络分组,并输出分组内容的工具,简单说就是数据包抓包工具.tcpdump凭借强大的功能和灵活的截取策略,使其成为Linux系统下用于网络分析和问题排查的首选工具. tcpd ...

  7. SGU 114.Telecasting station

    题意: 百慕大的每一座城市都坐落在一维直线上.这个国家的政府决定建造一个新的广播电视台.经过了许多次试验后,百慕大的科学家们提出了一个结论,在每座城市的不满意度等于这座城市的市民数与这座城市与广播电视 ...

  8. 【cogs858】磁性链

    [题目描述] 有N块编号为1~N的特殊磁石相互吸附组成一条磁性链,只有它们紧挨着时才会传递吸力,他们之间的吸力很大,如果我们要从N块相连的磁石中取出一块,那么需要消耗N-1个单位的能量,空缺处不再有吸 ...

  9. select、poll、epoll用法

    我们先从著名的C10K问题开始探讨,由于早期在网络还不普及的时候,互联网的用户并不是很多,一台服务器同时在线100个用户估计在当时已经算是大型应用了.但是随着互联网的发展,用户群体迅速的扩大,每一个用 ...

  10. python - StringIO文本缓冲

    参考:http://pymotwcn.readthedocs.org/en/latest/documents/StringIO.html 类StringIO提供了一个在内存中方便处理文本的类文件(读, ...