2011-09-27 72 views
0

我有一個運行的schedule.It一個應用程序連接到FTP服務器,並從遠程folder.scheduler文件運行在每5min time.Sometimes當有很多遠程位置的文件,調度運行當第一個週期正在運行時。在這種情況下,有時它會下載0個大小的文件,即使實際文件大小在遠程位置大於0。是否有人知道爲什麼會發生這種情況?Java的FTP文件獲取問題

下面是導入文件的代碼。

private void importEDIFiles(String host, String user, String password, String path, String road) { 
     try { 
      String edi824Path = path + "/" + EDI_824_FOLDER; 
      FTPBroker ftpBroker = new FTPBroker(host, user, password, edi824Path); 

      FTPClient client = ftpBroker.makeFTPConeection(); 
      String os = client.getSystemName(); 
      client.setFileTransferMode(FTP.ASCII_FILE_TYPE); 
      File edi824File = null; 
      File edi824Filebak = null; 
      ArrayList<FTPFile> files; 
      try { 

       FTPFile[] ftpfiles = client.listFiles(); 

       logger.info("\t" + ftpfiles.length + " files are in ftp location "); 
       if (ftpfiles.length > 0) { 
        files = removeZeroFiles(ftpfiles); 
        for(int x=0;x<files.size();x++){ 
         logger.info("name ---"+files.get(x).getName()); 
         logger.info("size ----"+files.get(x).getSize()); 
        } 
        String ftpFile = null; 
        logger.info("\t" + files.size() + " downloading from " + road + " rail road."); 
        for (int i = 0; i < files.size(); i++) { 
         ftpFile = files.get(i).getName(); 
         logger.info("\t" + ftpFile + " is downloading...."); 
//      logger.info("\t" + ftpFile + " size ...." + ftpFile.isEmpty()); 

         String source = destinationFilePath + pathSeparator + road + pathSeparator + ftpFile; 
         String target = edi_824backupFilePath + pathSeparator + road + pathSeparator + ftpFile; 
         edi824File = new File(source); 
         edi824Filebak = new File(target); 
         FileOutputStream fosout = new FileOutputStream(source); 

         boolean isRetrieved = client.retrieveFile(ftpFile, fosout); 
         logger.debug("isRetrieved : " + isRetrieved); 
         FileUtils.copyFile(edi824File,edi824Filebak); 
         fosout.flush(); 
         fosout.close(); 


         boolean isDelete = client.deleteFile(ftpFile); 
         logger.debug("isDelete : " + isDelete); 

        } 

       } else { 
        logger.info("No files to Pull in the FTP Location for " + user); 
        //throw new RuntimeException("No files to Pull in FTP Location."); 
       } 
      } catch (Exception e) { 
       logger.error(e,e); 
       e.printStackTrace(); 
      } finally { 
       client.logout(); 
       client.disconnect(); 


      } 


     } catch (Exception ex) { 
      logger.error(ex, ex); 
      ex.printStackTrace(); 
     } 


    } 

回答

0

你可以使用一個標誌布爾isRunning(),setRunning(布爾),並同步您的代碼,以便兩個或更多的線程不會在同一時間運行相同的方法