2017-02-22 2 views
1

Ich bin neu in Spring Batch und ich begann mit Spring Boot & Spring Batch offiziellen tutorial.Spring Batch: Übergeben Namen der eingelesenen Dateien zum nächsten Schritt

Das Problem, das ich habe, ist, dass, nachdem ich einige Dateien mit Spring Batch eingelesen habe, möchte ich die Namen dieser Dateien speichern und sie im nächsten Schritt entfernen.

Ich habe zuerst StepExecutionContext versucht, Daten zu übergeben, aber anscheinend waren die Daten, die ich weitergeben wollte, viel zu groß. Also habe ich versucht, den Namen der Dateien zu speichern, die ich gelesen habe, als ich meinen Reader initialisiert und diese Datei in meinem nächsten Schritt gelesen habe.

@Bean 
public MultiResourceItemReader<Widget> widgetMultiReader() { 
    MultiResourceItemReader<Widget> reader = new MultiResourceItemReader<Widget>(); 
    ClassLoader cl = this.getClass().getClassLoader(); 
    ResourcePatternResolver resolver = new PathMatchingResourcePatternResolver(cl); 
    try { 
     System.out.println("file:" + dataFileLocation + "Widget*.dat"); 
     Resource[] resources = resolver.getResources("file:" + dataFileLocation + "Widget*.dat"); 
     System.out.println("FOUND " + resources.length + " Widget.dat files"); 
     StringBuilder sb = new StringBuilder(); 
     for (int i=0; i<resources.length; i++) { 
      System.out.println(resources[i].getFilename()); 
      sb.append(resources[i].getFilename()); 
      if(i < resources.length-1){ 
       sb.append("\n"); 
      } 
     } 
     reader.setResources(resources); 
     reader.setDelegate(widgetReader()); 

     File tempFolder = new File(dataFileLocation + Constants.TEMP_FOLDER_NAME); 
     tempFolder.mkdir(); 
     File tempFile = new File(tempFolder.getAbsolutePath(), "read_in_files.tmp"); 
     tempFile.createNewFile(); 
     FileWriter fileWriter = new FileWriter(tempFile, false); 
     fileWriter.write(sb.toString()); 
     fileWriter.close(); 
    } catch (IOException e) { 
     e.printStackTrace(); 
    } 
    return reader; 
} 

Das war alles sehr gut funktioniert, aber stellt sich heraus, wenn ich das tue, der Code innerhalb der Bohne automatisch ausgeführt wird, auch wenn es nicht in der Jobschritt definiert ist. Dies ist offenbar wegen Abhängigkeitsinjektion (Spring boot spring.batch.job.enabled=false not able to recognize)

Also muss ich meine Methode noch einmal ändern Können Sie mir bitte hier helfen?

Alles, was ich tun möchte, ist in eine Reihe von Textdateien einzulesen, die darin enthaltenen Daten einzulesen, in der Datenbank zu speichern (das ist schon erledigt) DANN, entferne/archiviere/verschiebe diese Dateien im nächsten Schritt Wenn also etwas wie FlatFileParseException auftritt, wird der gesamte Job angehalten und die Dateien nicht entfernt.

+0

Bitte überprüfen Sie hier http://stackoverflow.com/questions/23323535/spring-batch-delete-the-flatfile-from-directory-after-processed –

+0

es ist leider eine von vielen, die ich überprüft habe, aber ich kann diesen Code nicht einmal implementieren, und selbst wenn ich das tue, tbh mag ich es nicht, Dateien bei einer Lese-Methode zu löschen, sondern würde es lieber als separaten Schritt mit einem Tasklet machen. – dK3

+0

Wenn dies der Fall ist, lese in Datei read() die Datei nicht, sondern speichere Dateinamen im Ausführungskontext, befördere diese Eigenschaft zum nächsten Schritt und führe die Löschung der Dateien durch –

Antwort

0

erstellen einen Dienst, der die Daten weitergeben zwischen den Schritten

Mit Anmerkungen versehen den Dienst mit @JobScope oder @StepScope es nur verwenden können, während dieser Schritt oder Job leben.

import org.springframework.batch.core.configuration.annotation.JobScope; 
import org.springframework.stereotype.Service; 

import java.io.File; 
import java.util.List; 

@Service 
@JobScope 
public class FilesService { 

    private List<File> files; 

    public List<File> getFiles() { 
     return files; 
    } 

    public void setFiles(List<File> files) { 
     this.files = files; 
    } 
} 
Verwandte Themen