FTP服务器中文环境引起润日下载不了附件问题解析

FTP服务器中文环境引起润日下载不了附件问题解析

一、问题背景:

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

   当天早上一上班就接到电话有人说信贷系统很多交易用不了,查看日志都是报的找不到文件,无法解析。后经过多方人员的共同努力查找和排查,最终确认是ReceiveFileTransfer.java类中的transfer()方法调用Apache组件commons-net-1.4.1.jar的listFiles时返回空问题引起,结合网上结论推断原因是目标服务器的中文语言环境,导致文件的修改日期格式,不能被apache正确解析造成的。(2月29)问题原因是定位到了,当务之急是如何快速让生产环境恢复正常运行,而不影响日常业务开展。经过多方讨论共提供三种解决方案:1、将目标服务器中当天使用频繁的交易所生成的文件临时改到20240228目录下;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
在这里插入图片描述
4.根据网上建议对该解析类的正则表达式进行优化,但直接反编译jar包中源代码不可取,会存在风险;所以采用了类似对该解析类重写的方式处理,首先在EOS的以下目录增加两个java文件。
在这里插入图片描述
将UnixFTPEntryParser中正表达式进行优化
在这里插入图片描述
5.再在调用listFiles()方法之前先让该方法的解析类指向新加的解析类,代码如下:
在这里插入图片描述
6.为了对该功能的影响降到最底,故对代码又做了特殊处理,只有2月29的情况才调用新加的解析类,其它日期还是延用之前的代码。
在这里插入图片描述
7.为此完成所有改动点总共涉及5个java文件,打包到测试1和测试3初步验证无问(延用了他原来的工厂类模式)。
在这里插入图片描述

三、问题总结

针对FTP服务器中文环境引起的润日下载不了附件问题,引入的commons-net的jar包版本需要是3.7或更高版本才能解决问题。

关于FTP服务器在中文环境下引起无法下载附件的问题,这通常与服务器设置、编码问题以及客户端代码的处理方式有关。在早先的版本中,比如 commons-net-1.4.1.jar,存在处理文件日期格式的问题,这在中文环境下尤其明显。例如,如果文件生成于闰年的2月29日,旧版本的FTPClient可能会遇到获取文件失败的情况。此外,某些情况下,需要在调用listFiles方法前将FTPClient设置为被动模式来确保正确列出文件。

为了解决这些兼容性和中文环境导致的问题,建议升级到更新版本的commons-net。从3.7版本开始,commons-net加入了更多的改进和支持,包括对中文等问题的修复。同时,这个版本也增加了对新的FTP命令的支持,提高了库的稳定性和可用性。

至于JDK 1.7版本的兼容性,虽然commons-net 3.7及以上版本主要是针对Java 8及更高版本优化的,但它们通常也向后兼容旧版本的Java,包括JDK 1.7。不过,为了确保最佳性能和避免潜在的兼容性问题,建议在可能的情况下升级到更新的Java版本。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/523007.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Linux第72步_使用“新字符设备的一般模板”编写LED驱动

使用“新字符设备的一般模板”编写LED驱动,使用寄存器直接开关灯。 1、创建LED目录 输入“cd /home/zgq/linux/Linux_Drivers/回车” 切换到“/home/zgq/linux/Linux_Drivers/” 输入“ls回车”,查看“/home/zgq/linux/Linux_Drivers/” 输入“mkdi…

优先完善功能测试,再考虑其他事项

软件测试是对项目研发过程产物(文档、代码、程序等)进行审查,保障产品质量的过程。 测试人员应具备从用户角度、开发角度和业务角度审查研发过程产物的能力,从而促使最终的产品达到用户、开发和业务三方要求。 测试人员的价值是…

(C语言)字符分类函数

目录 字符分类函数 1. iscntrl 2. isspace 3. isdigit 4. isxdigit 5. islower 6. isupper 7. isalpha 8. isalnum 9. ispunct 10. isgraph 11. isprint 字符分类函数 C语言中有一系列的函数是专门做字符分类的 ,也就是一个字符是属于什么类型的字符的。…

安泰ATG-3090功率信号源的输出信号是什么意思

功率信号源是指能够提供电能输出的设备,其输出信号通常以功率的形式存在。功率信号源在各种应用中发挥着重要作用,涵盖了广泛的领域,包括电力系统、通信、电子设备等。以下是关于功率信号源输出信号的详细介绍。 功率信号源是一种能够将输入能…

操作系统:进程优先级

目录 1.进程优先级 1.1.基本概念 1.2.其他概念 1.3.进程切换 2.解读Linux2.6内核进程的调度队列 1.进程优先级 1.1.基本概念 我们在日常生活中的经验,排队的本质就是确认优先级,排队的原因就是资源不足,需要进行分配。那么在内存资源有…

【Spring知识体系】1.1 Java 注解(Annotation)

文章目录 1.1 注解(Annotation)1.1.1 什么是注解1.1.2 内置注解1.1.3 元注解(5种)1.14 自定义注解1.15 注解使用场景介绍※ 本文小结 1.1 注解(Annotation) 1.1.1 什么是注解 注解的定义:它提…

电力物联网系统设计

电力物联网系统设计 简介 在新能源行业从业多年,参与和负责过大大小小的的项目,发电侧、电网侧、用户侧系统都有过实际的项目经验,这些项目或多或少都有物联网采集方面的需求,本篇文章将会对电力行业物联网经验做一个总结分享。 …

2.4_1 死锁的概念

文章目录 2.4_1 死锁的概念(一)什么是死锁(二)死锁、饥饿、死循环的区别(三)死锁产生的必要条件(四)什么时候会发生死锁(五)死锁的处理策略 总结 2.4_1 死锁的…

Windows 安装 Xinference

Windows 安装 Xinference 0. 引言1. 创建虚拟环境2. 安装 pytorch3. 安装 llama_cpp_python4. 安装 chatglm-cpp5. 安装 Xinference6. 设置 model 路径7. 启动 Xinference8. 查看 Cluster Information 0. 引言 Xorbits Inference(Xinference)是一个性能…

3D-Genome | Hi-C互作矩阵归一化指南

Hi-C 是一种基于测序的方法,用于分析全基因组染色质互作。它已广泛应用于研究各种生物学问题,如基因调控、染色质结构、基因组组装等。Hi-C 实验涉及一系列生物化学反应,可能会在输出中引入噪声。随后的数据分析也会产生影响最终输出噪声&…

蓝桥杯2023年-买瓜(dfs,类型转换同样耗时)

题目描述 小蓝正在一个瓜摊上买瓜。瓜摊上共有 n 个瓜,每个瓜的重量为 Ai 。 小蓝刀功了得,他可以把任何瓜劈成完全等重的两份,不过每个瓜只能劈一刀。 小蓝希望买到的瓜的重量的和恰好为 m 。 请问小蓝至少要劈多少个瓜才能买到重量恰好…