当前位置: 首页 > 面试题库 >

Apache Commons FTPClient挂起

江佐
2023-03-14
问题内容

我们使用以下Apache Commons Net FTP代码连接到FTP服务器,轮询某些目录中的文件,如果找到文件,则将它们检索到本地计算机:

try {
logger.trace("Attempting to connect to server...");

// Connect to server
FTPClient ftpClient = new FTPClient();
ftpClient.setConnectTimeout(20000);
ftpClient.connect("my-server-host-name");
ftpClient.login("myUser", "myPswd");
ftpClient.changeWorkingDirectory("/loadables/");

// Check for failed connection
if(!FTPReply.isPositiveCompletion(ftpClient.getReplyCode()))
{
    ftpClient.disconnect();
    throw new FTPConnectionClosedException("Unable to connect to FTP server.");
}

// Log success msg
logger.trace("...connection was successful.");

// Change to the loadables/ directory where we poll for files
ftpClient.changeWorkingDirectory("/loadables/");

// Indicate we're about to poll
logger.trace("About to check loadables/ for files...");

// Poll for files.
FTPFile[] filesList = oFTP.listFiles();
for(FTPFile tmpFile : filesList)
{
    if(tmpFile.isDirectory())
        continue;

    FileOutputStream fileOut = new FileOutputStream(new File("tmp"));
    ftpClient.retrieveFile(tmpFile.getName(), fileOut);
    // ... Doing a bunch of things with output stream
    // to copy the contents of the file down to the local
    // machine. Ommitted for brevity but I assure you this
    // works (except when the WAR decides to hang).
    //
    // This was used because FTPClient doesn't appear to GET
    // whole copies of the files, only FTPFiles which seem like
    // file metadata...
}

// Indicate file fetch completed.
logger.trace("File fetch completed.");

// Disconnect and finish.
if(ftpClient.isConnected())
    ftpClient.disconnect();

logger.trace("Poll completed.");
} catch(Throwable t) {
    logger.trace("Error: " + t.getMessage());
}

我们计划将其每分钟运行一次。当部署到Tomcat(7.0.19)时,此代码可以很好地加载并开始正常运行。但是,每次似乎都在 挂起 。我的意思是:

  • 不存在堆转储
  • Tomcat仍在运行(我可以看到其pid并可以登录到Web Manager应用程序)
  • 在管理器应用程序中,我可以看到我的WAR仍在运行/启动
  • catalina.out 而且我的应用程序专用日志没有任何异常抛出的迹象

因此,JVM仍在运行。Tomcat仍在运行,而我部署的WAR仍在运行,但是它刚刚挂起。有时它会运行2个小时,然后挂起。有时它会运行几天然后挂起。但是当它挂起时,它会在读取的行About to check loadables/ for files...(我确实在日志中看到)和读取的行File fetch completed.(我没有看到)之间这样做。

这告诉我挂起发生在实际轮询/获取文件的过程中,这种情况使我指出了与该问题相同的方向,这个问题使我能够找到与FTPClient死锁有关的问题。这让我想知道这些是否是相同的问题( 如果是的话,我会很乐意删除此问题!
)。不过,我不认为 认为 它们是相同的(我没有看到我日志中的同样的例外)。

一位同事提到这可能是“被动”与“主动”
FTP的问题。没有真正知道的区别,我由FTPClient领域糊涂一点ACTIVE_REMOTE_DATA_CONNECTION_MODEPASSIVE_REMOTE_DATA_CONNECTION_MODE等等,不知道为什么情绪这么想过,作为一个潜在的问题。

由于我在Throwable这里是不得已而为之的html" target="_blank">方法,因此,如果出现问题,我本可以期望在日志中看到 某些内容 。嗯,我觉得这绝对是个难题。

有任何想法吗?不幸的是,我对FTP的内部知识了解不足,无法做出可靠的诊断。这可能是服务器端的东西吗?与FTP服务器相关?


问题答案:

这可能有很多事情,但是您朋友的建议是值得的。

尝试ftpClient.enterLocalPassiveMode();看看是否有帮助。

我还建议 将断开连接放在finally块中,以使其永远不会留下连接。



 类似资料:
  • 问题内容: 由于几个小时后,每次您执行session_start时,我们的服务器都会挂起。 为了进行测试,我创建了一个脚本,如下所示: 从控制台调用它会挂起,甚至无法用ctrl- c停止,只能杀死-9作品。通过Apache调用它也是一样。保持为空,但权限绝对可以,www可以写,并且还具有所有父文件夹的读取权限。 根据管理员的说法,服务器上没有进行任何更改,也没有为会话注册特殊代码。服务器是Cent

  • 问题内容: 伙计们,我现在感觉真的很愚蠢。…基本上我是通过本地计算机上的TCP连接的…并且当我尝试在客户端创建In / out流时,不会通过创建对象输入流。是什么赋予了?这在打印2之后停止…没有异常或任何事情…这不是我第一次使用此类,这是我感到困惑的部分原因。 问题答案: 根据ObjectInputStream 的规范: 该构造函数将阻塞,直到相应的ObjectOutputStream写入并刷新了

  • 我正在开发一款支持USB OTG的android手机。

  • 问题内容: 很抱歉,这篇文章很长,但我想知道在向Sun提交错误报告之前是否能对此引起更多的关注。 JVM:6u11 操作系统:Windows XP SP3 硬件:AMD Athlon 64 X2 4600+ @ 2.41GHz,具有3.25 GB RAM。 我相信我在JVM中遇到了一个错误,在该错误中没有给线程任何监视器。在以下线程跟踪中,监视器是由捕获的,最终等待了它。该线程随后被通知。但是,即

  • 问题内容: 我正在执行一个命令,该命令向我返回文件的修订号;’文档名称’。但是,如果执行命令时遇到问题,则应用程序将挂断。我该怎么做才能避免这种情况?请在下面找到我的代码。 问题答案: 我想问题是您只在读取InputStream而没有在读取ErrorStream。您还必须注意并行读取两个流。可能发生这种情况,当前从输出流中管道传输的数据已填满OS缓冲区,您的exec命令将自动挂起,以使您的阅读器有

  • 不确定是否有人遇到过这个问题。我正在使用带有EJB3.1的JBoss7.1应用程序服务器和带有HiberNate实现的JPA2.0。我正在使用后端Oracle 11g数据库。请参阅下面的代码。我正在使用由HTTP GET请求驱动的servlet调用我的EJB。 当我在下面的代码中注释掉 时,我的网页会永远挂起,一段时间后我会得到下面的堆栈跟踪(如果我调试,它会让我直到 persist() 方法,然