Chúng tôi đang sử dụng mã Apache Commons Net FTP sau để kết nối với một máy chủ FTP, thăm dò ý kiến một số thư mục cho các tập tin, và nếu file được tìm thấy, để lấy chúng để máy cục bộ:Apache Commons FTPClient Treo
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());
}
Chúng tôi có kế hoạch để chạy từng phút, vào phút. Khi được triển khai tới Tomcat (7.0.19), mã này tải lên hoàn toàn tốt và bắt đầu làm việc mà không bị cản trở. Tuy nhiên, mỗi lần, tại một thời điểm nào đó, có vẻ như chỉ treo. Bởi rằng tôi có nghĩa là:
- Không bãi đống tồn tại
- Tomcat vẫn chạy (tôi có thể thấy pid của nó và có thể đăng nhập vào các ứng dụng quản lý web)
- Bên trong ứng dụng quản lý, tôi có thể thấy WAR của tôi vẫn chạy/bắt đầu
catalina.out
và ứng dụng cụ thể cho thấy đăng nhập của tôi không có dấu hiệu của bất kỳ trường hợp ngoại lệ được ném
Vì vậy, các JVM vẫn chạy. Tomcat vẫn đang chạy, và WAR đã triển khai của tôi vẫn đang chạy, nhưng nó chỉ bị treo. Đôi khi nó chạy trong 2 giờ và sau đó bị treo; thời gian khác nó chạy trong nhiều ngày và sau đó bị treo. Nhưng khi nó treo, nó làm như vậy giữa dòng mà đọc About to check loadables/ for files...
(mà tôi thấy trong các bản ghi) và dòng mà đọc File fetch completed.
(mà tôi không nhìn thấy).
Điều này cho tôi biết sự cố xảy ra trong quá trình thăm dò/tìm nạp thực tế các tệp, loại tôi theo cùng một hướng như this question mà tôi có thể tìm thấy mối quan ngại nào với sự bế tắc FTPClient. Điều này khiến tôi băn khoăn nếu đây là những vấn đề tương tự (nếu có, tôi sẽ vui vẻ xóa câu hỏi này!). Tuy nhiên, tôi không nghĩ rằng tin rằng chúng giống nhau (tôi không thấy ngoại lệ tương tự trong nhật ký của mình).
Một đồng nghiệp đề cập đến nó có thể là một "thụ động" so với "FTP" hoạt động. Không thực sự biết sự khác biệt, tôi là một chút bối rối bởi các lĩnh vực FTPClient ACTIVE_REMOTE_DATA_CONNECTION_MODE
, PASSIVE_REMOTE_DATA_CONNECTION_MODE
, vv và không biết những gì SO nghĩ về điều đó như là một vấn đề tiềm năng.
Vì tôi đang xem Throwable
s là phương sách cuối cùng ở đây, tôi đã mong đợi sẽ thấy nội dung nào đó trong nhật ký nếu có điều gì đó không ổn. Ergo, tôi cảm thấy như đây là một vấn đề treo chắc chắn.
Bất kỳ ý tưởng nào? Thật không may tôi không biết đủ về FTP internals ở đây để thực hiện một chẩn đoán chắc chắn. Điều này có thể là một cái gì đó phía máy chủ? Liên quan đến máy chủ FTP?
Chỉ có điều mà có thể không có ý nghĩa với câu trả lời của tôi là lý do tại sao các công trình này đôi khi. – tjg184
Chính xác! Và không chỉ * đôi khi * ... nó hoạt động khoảng 99,9% thời gian! Thats lý do tại sao tôi cảm thấy như thế này là một vấn đề phía máy chủ ... cảm ơn cho các đề xuất mặc dù tôi sẽ thử cả hai! – IAmYourFaja
Trong sự tò mò, sự khác biệt thực sự giữa thụ động/hoạt động là gì? Sự hiểu biết của tôi là, dưới hoạt động, máy chủ của nó khởi tạo kết nối. Đó có phải là ý chính của nó không? – IAmYourFaja