问题1.:在本地Windows环境下载设置springboot的属性文件时变量名称取值 user 和password的时候,运行没有问题,但是在 放到linux下去跑的时候一直提示ftp登录不上去,打印出来的日志显示登录用户名为当前linux登录的用户名称,后来查找资料得知,user为linux系统下的关键字,在springboot下取值的时候会自动取得当前登录用户名称,所以造成上述bug,同理在Windows下设置用户名不能取名字为userName,这样会取到Windows当前登录用户名称

问题2.在检查ftp远程文件是否存在的时候调用client.listFiles(path);方法的时候出现卡死,(本机自己的搭建的ftp跑不会出现这样情况)

解决办法:由于之前设置的ftp连接方式为主动方式,现在改为被动模式: ftpClient.enterLocalPassiveMode();之后不再卡死

在改用被动模式之前甚至出现过,打印日志出来的访问地址准确无误,远程也存在此文件夹,但是就是调用api无法找到这个文件,很郁闷,后来经历查资料发现造成这样原因取决于FTP的访问模式:

             主动模式和被动模式区别

 一般来说,如果这个FTP服务器只对企业的内部局域网客户提供文件传输的服务,那么基本上两者的应用效果没有很大的差异。但是如果企业网络外部的用户也 需要通过互联网与FTP服务器进行文件传输的话,就会有很大的不同。这主要是因为,在数据通道建立的过程中,客户端会在另一个端口上监听等待连接,并利用 命令连接通道告诉服务器其监听的端口好。然后企业的边界路由器会将FTP的IP地址转换为合法的公网IP地址(假设企业由于公网IP地址有限,在边界路由 器上通过NAT服务向外部用户提供FTP连接)。如果此时采用的是自动操作模式的话,则在连接这个数据通道的过程中FTP服务器会主动跟边界路由器的端口 进行通信(因为FTP服务器认为这台边界路由器,其实就是NAT服务器,就是FTP客户段)。但是实际上不是,而且也有可能没有启用这个端口。为此客户端 与FTP服务器之间的连接最终没有建立起来。所以说,如果采用主动操作模式的话,当FTP服务器部署在NAT等服务器后面的时候,则FTP服务器与客户端 之间只能够建立命令连接通道,而无法建立起数据传输通道。如果FTP服务器与客户端之间还有防火墙的话,在连接的过程中也会出现以上类似的情况。 

   而如果是采用被动操作模式的话,是客户端主动跟服务期的20号端口进行连接的。为此在数据传输通道建立的过程中,即使中间有NAT服务器或者防火墙,也 会准确无误的连接到FTP服务器的数据传输接口。所以说,如果在客户端与FTP服务器之间存在防火墙或者NAT服务器等类似设备的话,那么在FTP服务器 部署的时候,最好采用被动操作模式。否则的话,很可能只能够建立命令连接通道,而无法进行数据传输。 
在 FTP服务器部署的时候,其默认采用的是主动操作模式。如果企业FTP服务器的用户都是在内部网络中的,即不用像外部网络的用户提供FTP连接的需求,那 么采用这个默认操作方式就可以了。但是如果一些出差在外的员工或者员工在家庭办公时也需要访问企业内部的FTP服务器,而此时出于安全的考虑或者公网IP 地址数量的限制,企业往往会把FTP服务器部署在防火墙或者NAT服务器的后面,此时这个主动操作模式就不行了

      总之,在FTP服务器部署的时候考虑是要采用主动操作模式还是被动操作模式,只需要记住一个原则,即如果把FTP服务器部署在防火墙或者NAT服务器的背 后,则采用主动操作模式的客户端只能够建立命令连接而无法进行文件传输。如果部署完FTP服务器后,系统管理员发现用户可以连接上FTP服务器,可以查看 目录下的文件,但是却无法下载或者上传文件,如果排除权限方面的限制外,那么很有可能就是这个操作模式选择错误。系统管理员告诉用户选择合适的操作模式, 基本上就可以解决文件传输的问题了。 

问题3:在用线程池执行下载任务的时候,发现有时候下载着然后不下了,就是提交任务发现线程call方法里面的代码没有被执行,但是也不报错,

   解决办法:1.首先考虑到可能是线程池中的线程在满负荷的运行,导致线程池队列中的任务不能执行,于是我的打开lsof -i:8080查看程序占用的进程号,

            2.输出命令:jstack查看线程池的线程池状态,发现6个线程的状态都是,仔细查看代码执行位置是在ftputil.download位置,发现socketrread,于是百度之后,发现原来ftp默认的读取远程数据的时候如果不设置超时时间那么会为一直阻塞下去,,那么该线程也就不能正常退出,其他任务也就无法得到执行,于是我设置了ftp的数据传输时间和socket的命令传输超时时间,问题得以解决,ftpClient.setDataTimeout(30 * 60 * 1000);

                  ftpClient.setSoTimeout(5*60 * 1000);

ftp 线程池 Java_NAT

问题4:程序在服务器上跑着的时候跑一会就会出现断开的管道异常信息

   解决办法:经检查代码发现问题出现在我下载完后在finnaly调用ftp.close方法的时候没有校验现在的连接状态是否已经是断开的了,如果是断开的了那么再次调用的时候就会出现断开的管道异常

ftp 线程池 Java_客户端_02