gpt4 book ai didi

java - 通过 FTP 下载 XML 文件

转载 作者:搜寻专家 更新时间:2023-11-01 03:10:20 24 4
gpt4 key购买 nike

我在数据库中有一个提要列表,我用它从 FTP 服务器下载 XML 文件,然后对其进行解析。脚本被捆绑到一个 jar 文件中,该文件每天使用 Windows 任务计划程序运行。有时请求会在抓取某个 xml 文件时受阻。到目前为止,它在 2 周内发生了大约 3 次,我看不到真正的模式。

当它搞砸时,我转到运行它的计算机,我看到命令窗口打开,但它在 xml 完全下载之前就停止了。如果我关闭命令窗口并手动运行任务,一切都会正常进行。

我用来下载 xml 文件的代码是:

private void loadFTPFile(String host, String username, String password, String filename, String localFilename){
System.out.println(localFilename);
FTPClient client = new FTPClient();
FileOutputStream fos = null;

try {
client.connect(host);
client.login(username, password);
String localFilenameOutput = createFile(assetsPath + localFilename);
fos = new FileOutputStream(localFilenameOutput);
client.retrieveFile(filename, fos);

} catch (IOException e) {
e.printStackTrace();
} finally {
try {
if (fos != null)
fos.close();
client.disconnect();
} catch (IOException e) {
e.printStackTrace();
}
}
}

这个函数在循环中被调用,当它失败时,一切都会停止,脚本不会进入下一个提要。

我不确定发生了什么,可能是连接丢失了,但我认为如果发生这种情况,try/catch 会捕获。我不确定超时是否可以解决问题或是否需要使用线程(但我从未使用过线程)

谁能给我指出正确的方向,告诉我为什么会发生这种情况,以及我能做些什么来解决这个问题

最佳答案

更新 - 为数据连接设置超时

由于最后一个文件只下载了一部分,并且给出了 FTPClient.retrieveFile() 的来源,我认为这可能是服务器端的问题(导致它挂起甚至死机的问题 - 谁知道)。显然无法修复服务器甚至不知道那里发生了什么,无论如何我建议添加一个超时 setDataTimeout(int)并捕获可能的 SocketTimeoutException 分别记录在不同的地方,并可能发送给 FTP 服务器管理员(连同它发生时的时间信息),以便他们可以合并日志并查看问题所在。

旧答案

我没有注意到你为每个文件连接和登录,所以下面只是一个优化不关闭控制连接并成功注销,但它应该 解决问题。

您可以在 Debug模式下启动 JVM 并在它挂起时附加调试器,无论如何根据 this answerthis thread它可能是网络设备(路由器)上的超时问题。来自FTPClient Javadoc

During file transfers, the data connection is busy, but the control connection is idle. FTP servers know that the control connection is in use, so won't close it through lack of activity, but it's a lot harder for network routers to know that the control and data connections are associated with each other. Some routers may treat the control connection as idle, and disconnect it if the transfer over the data connection takes longer than the allowable idle time for the router.

对此的一种解决方案是通过控制连接发送安全命令(即 NOOP)以重置路由器的空闲计时器。这是启用如下:

ftpClient.setControlKeepAliveTimeout(300); // set timeout to 5 minutes

关于java - 通过 FTP 下载 XML 文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12078794/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com