2014-11-17 36 views
2

我是Spring批處理新手。我需要實現以下功能: 第1步:將文件從遠程位置複製到本地目錄。 第2步:處理文件的每一行。 步驟3:將處理後的行存儲到數據庫中。Spring批處理 - 從遠程位置複製文件

我確信最後兩步,但我該如何實現第一步?

感謝您的幫助。

+0

我敢肯定,這樣的問題已經被張貼在SO。到處搜索 –

回答

0

你可以寫一個微進程來實現這一任務蕾這將在單獨的步驟

<step id="movingFile" next="step2"> 
     <tasklet ref="voterImportFileMovingTasklet" /> 
     <listeners> 
      <listener ref="stepLevelListener" /> 
     </listeners> 
    </step> 
<step id="step2" > 
      <chunk reader="FileReader" processor="ItemProcessor" writer="ItemWriter" commit-interval="300" 
       skip-limit="1000"> 
       <skippable-exception-classes> 
        <include class="java.lang.Exception" /> 
        </skippable-exception-classes> 
       <listeners> 
        <listener ref="voterImportListener" /> 
       </listeners> 
      </chunk> 
    </step> 

微進程將

public class FileMovingTasklet implements Tasklet, InitializingBean { 
private Resource sourceDirectory; 
private Resource targetDirectory; 



private static final Log LOG = LogFactory.getLog(FileMovingTasklet.class); 

public Resource getSourceDirectory() { 
    return sourceDirectory; 
} 

public void setSourceDirectory(Resource sourceDirectory) { 
    this.sourceDirectory = sourceDirectory; 
} 

public Resource getTargetDirectory() { 
    return targetDirectory; 
} 

public void setTargetDirectory(Resource targetDirectory) { 
    this.targetDirectory = targetDirectory; 
} 


@Override 
public void afterPropertiesSet() throws Exception { 
    Assert.notNull(sourceDirectory, "Source directory must be set"); 
    Assert.notNull(targetDirectory, "Target directory must be set"); 
} 

@Override 
public RepeatStatus execute(StepContribution contribution, ChunkContext chunkContext) throws Exception { 

    InputStream inStream = null; 
    OutputStream outStream = null; 
    File[] files; 
    File dir = sourceDirectory.getFile(); 
    Assert.state(dir.isDirectory()); 
     files = dir.listFiles(); 
    File bfile = null; 
    for (int i = 0; i < files.length; i++) { 


      bfile = new File(targetDirectory.getURL().getPath() + File.separator + files[i].getName()); 

     inStream = new FileInputStream(files[i]); 
     outStream = new FileOutputStream(bfile); 

     byte[] buffer = new byte[1024]; 

     int length; 
     // copy the file content in bytes 
     while ((length = inStream.read(buffer)) > 0) { 

      outStream.write(buffer, 0, length); 

     } 

     inStream.close(); 
     outStream.close(); 
    } 
    return RepeatStatus.FINISHED; 
}