【发布时间】:2021-03-15 16:14:23
【问题描述】:
我有使用 LIST 命令轮询 FTP 服务器的服务。我使用本地被动模式,使用具有以下设置的 FTPSClient:
ftpClient.setTrustManager(TrustManagerUtils.getAcceptAllTrustManager());
ftpClient.setDataTimeout(1800000); //30 minutes
ftpClient.setBufferSize(1281000000);
ftpClient.setControlKeepAliveTimeout(120);
FTP 服务器目录中有大约 700,000 个文件,因此服务器响应需要时间。在我的本地机器上,通过启动原始 Java 应用程序,检索文件列表大约需要 5 分钟,在 Windows 上的 Docker 容器中,它也可以同时正常工作,FileZilla - 没问题,但时间更长。但是,当我在 Linux 机器(Ubuntu 18.04.4 LTS)上运行容器时,尽管它可以连接到服务器,但它无法检索数据。在超时设置的指定时间后,我收到:
原因:java.net.SocketTimeoutException:读取超时 java.net.SocketInputStream.socketRead0(Native Method) ~[?:?] at java.net.SocketInputStream.socketRead(SocketInputStream.java:115) ~[?:?] at java.net.SocketInputStream.read(SocketInputStream.java:168) ~[?:?] at java.net.SocketInputStream.read(SocketInputStream.java:140) ~[?:?] 在 sun.nio.cs.StreamDecoder.readBytes(StreamDecoder.java:284) ~[?:?] 在 sun.nio.cs.StreamDecoder.implRead(StreamDecoder.java:326) ~[?:?] 在 sun.nio.cs.StreamDecoder.read(StreamDecoder.java:178) ~[?:?] at java.io.InputStreamReader.read(InputStreamReader.java:185) ~[?:?] at java.io.BufferedReader.fill(BufferedReader.java:161) ~[?:?] 在 java.io.BufferedReader.readLine(BufferedReader.java:326) ~[?:?] 在 java.io.BufferedReader.readLine(BufferedReader.java:392) ~[?:?] 在 org.apache.commons.net.ftp.FTPFileEntryParserImpl.readNextEntry(FTPFileEntryParserImpl.java:53) ~[app.jar:?] 在 org.apache.commons.net.ftp.FTPListParseEngine.readStream(FTPListParseEngine.java:142) ~[app.jar:?] 在 org.apache.commons.net.ftp.FTPListParseEngine.readServerList(FTPListParseEngine.java:118) ~[app.jar:?] 在 org.apache.commons.net.ftp.FTPClient.initiateListParsing(FTPClient.java:3450) ~[app.jar:?] 在 org.apache.commons.net.ftp.FTPClient.initiateListParsing(FTPClient.java:3371) ~[app.jar:?] 在 org.apache.commons.net.ftp.FTPClient.initiateListParsing(FTPClient.java:3308) ~[app.jar:?] 在 org.my.org.ftp.FtpOperator.listDirectory(FtpOperator.java:30) ~[app.jar:?]
我想这不是防火墙的问题,因为我有类似的服务来轮询外部服务器并且它工作正常。两种服务都使用 Apache FTP 客户端库的本地被动模式。
Docker 编写文件:
version: '2'
services:
ingest:
image: pl/ingest
ports:
- "8038:8038"
volumes:
- ./logs:/logs
- ./processedFiles:/processedFiles
networks:
default:
driver: bridge
driver_opts:
com.docker.network.driver.mtu: 1500
【问题讨论】:
-
@MartinPrikryl 我可以通过命令行 FTP 客户端(不是 FTPS)检索列表。我通过运行 JAR 文件在没有 Docker 的情况下运行此应用程序,该文件使用 FTPS(实际上是 gradle 运行命令),它也可以列出目录。这一切都在 Linux 机器上。
-
普通 FTP 在 Java 中工作,命令行 FTPS 客户端也可以工作。普通 FTP 在 Docker 中也不起作用。
-
我的意思是命令行 FTP 客户端工作在与 Docker 容器不同的环境中,无论是普通的还是 FTPS。 Java JAR(gradle run)在相同的环境中工作 Docker 的容器不是普通的和 FTPS。普通的 FTP 和 FTPS(在 Java JAR 中)都不能在 Docker 的容器中工作。
标签: java docker ftp apache-commons-net