2011-09-27 75 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(布尔),并同步您的代码,以便两个或更多的线程不会在同一时间运行相同的方法