2016-03-30 9 views
0

Ich lese eine Flat-Datei mit Feder Batch FlatFileItemReader.Spring Batch FlatFileItemReader Füllwert für alle Artikel/Zeilen lesen

Ich habe ein requestId Feld, das ich mit einem eindeutigen Wert für alle Datensätze füllen muss, die aus der flachen Datei gelesen werden. zB: Wenn ich file1 lese. Ich möchte die requestId auf 1 für alle Objekt-Objekte, die im Feld requestId erstellt wurden, setzen. Für Datei2 muss ich requestId auf 2 setzen.

Meine requestId wird eindeutig von einer separaten Klasse generiert.

Wie kann ich dies mit Federbatch erreichen?

Antwort

0

gibt es einige mögliche Lösungen

verwenden, um ein ResourceAware Artikel

public class MyItem implements ResourceAware { 

    private Resource resource; 

    public String getId() { 
     return createIdFromResource(resource); 
    } 

    private String createIdFromResource(final Resource resource) { 
     // create your ID here 
     return resource.getFilename(); 
    } 

    @Override 
    public void setResource(final Resource resource) { 
     this.resource = resource; 
    } 
} 

eine Listener verwenden (hier mit Schnittstellen, weniger ausführlich Gebrauch von Anmerkungen ist ebenfalls möglich)

public class TestListener implements StepExecutionListener, ItemReadListener<String> { 
    private StepExecution stepExecution; 
    private static final String CURRENT_ID = "currentId"; 

    @Override 
    public void beforeStep(final StepExecution stepExecution) { 
     this.stepExecution = stepExecution; 
    } 

    @Override 
    public ExitStatus afterStep(final StepExecution stepExecution) { 
     return null; 
    } 

    @Override 
    public void beforeRead() { 
    } 

    @Override 
    public void afterRead(final String item) { 
     String currentId = null; 
     if (stepExecution.getExecutionContext().containsKey(CURRENT_ID)) { 
      currentId = stepExecution.getExecutionContext().getString(CURRENT_ID); 
     } else { 
      String fileName = stepExecution.getExecutionContext().getString("fileName"); 
      // ... create ID from FileName 
      currentId = fileName + "foo"; 
      stepExecution.getExecutionContext().put(CURRENT_ID, currentId); 
     } 
    } 

    @Override 
    public void onReadError(final Exception ex) { 
    } 
} 

in der Im obigen Beispiel ist der aktuelle Dateiname im StepExecutionContext verfügbar, möglicherweise müssen Sie ihn aus jobParameters und extrac ziehen t der Dateiname

String paramValue = stepExecution.getJobExecution().getJobParameters().getString("paramName"); 
// extract fileName from paramValue 
+0

Ich benutzte den StepListener und es funktionierte wie eine Schönheit. Vielen Dank –