我们使用以下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)时,这段代码可以很好地加载,并且可以顺利地开始工作。但是,每次在某个时刻,它似乎都会挂起。我的意思是:
catalina.out
,并且我的特定于应用程序的日志没有任何抛出异常的迹象因此,JVM仍在运行。Tomcat仍在运行,我部署的WAR也仍在运行,但它只是挂起。有时它运行2小时后挂起;有时它运行几天后挂起。但是当它挂起时,它会在显示About to check loadables/ for files...
(我确实在日志中看到)和File fetch completed.
(我看不到)的行之间执行。
这告诉我,挂起发生在文件的实际轮询/获取期间,这使我能够找到与FTPClient死锁有关的this question的相同方向。这让我想知道这些是不是相同的问题(如果是,我会很高兴地删除这个问题!)。然而,我不相信它们是相同的(我在我的日志中没有看到相同的例外)。
一位同事提到,这可能是“被动”vs.“主动”FTP的事情。由于不太清楚其中的区别,我对FTPClient字段ACTIVE_REMOTE_DATA_CONNECTION_MODE
、PASSIVE_REMOTE_DATA_CONNECTION_MODE
等感到有点困惑,也不知道这是一个潜在的问题。
因为我在这里捕获的是Throwable
s作为最后的手段,所以如果出现问题,我会期望在日志中看到一些东西。因此,我觉得这确实是一个悬而未决的问题。
有什么想法吗?不幸的是,我对FTP内部结构的了解还不够多,无法做出明确的诊断。这会是服务器端的东西吗?与FTP服务器相关?
https://stackoverflow.com/questions/9706968
复制相似问题