2017-09-20 1 views
2

ich ein Neuling bin Charge zu springen, würde Ich mag den perfekten Ansatz finden, mit dem Anwendungsfall zu verwenden, wie hier gezeigt:best practice speichern Dateien auf der Karte mit Feder Batch

ich mehr CSV-Dateien, die ich möchte sie auf Memory (als Collection Store .. dh List Map) speichern, dann würde ich gerne auf sie bei den nächsten Schritten/Jobs für meine Logik Geschäft/beziehen.

Nehmen wir ein Beispiel für ein Objekt XX, das in Map mit einem ItemWriter gespeichert ist.

Objekt XX Modell

public class Object { 

private int x; 
private int y; 
// getters setters 
} 

die itemReader für Objekt X

public class ObjectItemReader extends FlatFileItemReader<Object> { 

    public ObjectItemReader() { 
     this.setResource(new ClassPathResource("xxx.csv"));  
     this.setLineMapper(new DefaultLineMapper<Object>() {{ 
      setLineTokenizer(new DelimitedLineTokenizer() {{ 
       setNames(new String[] { "x", "y" }); 
       setDelimiter(DELIMITER_TAB); 
      }}); 
      setFieldSetMapper(new BeanWrapperFieldSetMapper<Object>() {{ 
       setTargetType(Object.class); 
      }}); 
     }}); 
    } 
} 

die ObjectWriter

public class ObjectItemWriter implements ItemWriter<Object> { 

    private Map<Long , Object> objectMap; 

    public ObjectItemWriter() { 
     System.out.println("Map Store is created "); 
     objectMap= new HashMap<Long , Object>(); 
    } 

    @Override 
    public void write(List<? extends Object> items) throws Exception { 
     for (Object depot : items) { 
      objectMap.put(depot.getX(), depot); 
     } 
    } 

    public Map<Long , Object> getobjectMap() { 
     return objectMap; 
    } 
} 

wie Sie alle Datensätze in der Karte mit dem itemWriter gespeichert sind, sehen kann, i machte einen Test mit einem einfachen Tasklet, um auf diese Karte in anderen Schritten zuzugreifen

public class TaskletStep implements Tasklet{ 

    @Autowired 
    private ObjectItemWriter objectItemWriter; 

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

     System.out.println(objectItemWriter.getobjectMap().size()); 

     return null; 
    } 
} 

Meine Fragen,

gibt es eine andere Art und Weise/bester Weg, um alle CSV-Dateien auf Speicher zu speichern, mit nur ItemReader oder ItemProcessor verwenden, da es ein einfachen Abrufen von Daten aus Dateien sind auf der Karte anzeigen?

Ist der itemWriter ein wesentlicher Schritt, um diese auf der Karte abgelegt zu speichern?

Antwort

0

Im Frühjahr Batch Batch-orientierte Schritte, definieren einen Leser & Writer (als Teil eines Schritts) sind obligatorisch, aber Prozessor ist optional. Siehe here

und dann können Sie immer wählen zu tun - NICHTS in einer Komponente und kann immer tun, was Sie in einer Komponente wollen unabhängig von den Namen (die Leser, Prozessor oder Schreiber).

Haben Sie gesagt, Sie haben nicht angegeben, warum Sie Karte in Reader oder Prozessor & nicht in Writer füllen möchten? Welche spezifischen Probleme haben Sie, wenn Sie die Karte im Writer füllen?

Meiner Meinung nach, wenn Sie Spring Batch gewählt haben, müssen Sie Ihr Programm nach vordefinierten und angenommenen Flow entwerfen, um einen sauberen Code und sauberes Design zu haben. Aus dieser Perspektive sieht Ihr aktueller Ansatz besser aus als Sie planen.

gibt es eine andere Art und Weise/bester Weg, um alle CSV-Dateien auf Speicher zu speichern, mit mit nur ItemReader oder ItemProcessor wie es ein einfachen ist Abrufen von Daten aus Dateien auf der Karte anzeigen?

Wie bereits angegeben, können Sie Karte in Prozessor auffüllen und haben einen Schriftsteller, der nichts tut. Sie müssen beachten, dass Chunking sowieso passieren wird und die Kontrolle wird zum Writer gehen, um die Transaktion zu begehen. Meiner Meinung nach, wenn Sie ein gelesenes Element vor dem Schreiben nicht umwandeln möchten, lassen Sie einfach den Prozessor weg und senden Sie Elemente direkt vom Leser zum Schreiber (in Blöcken).

Wenn Sie die Karte im Reader ausfüllen, verletzen Sie das Single Responsibility-Prinzip (SRP). Dies ist nicht ratsam.

Ist das der itemWriter ein wesentlicher Schritt ist, diese auf Karte abgelegt zu speichern?

Es ist wichtig, solange Sie an entkoppelte Komponenten und SRP glauben.

Warum benötigt jemand drei Komponenten, wenn eine einzelne Komponente die Aufgabe erfüllen kann? Ihre Fragen lassen mich fragen, warum wir sogar Spring Batch API/Framework (nur zu verwenden - FlatFileItemReader Klasse?)?

Hoffe es hilft !!

+0

Zuerst danke für Ihre freundliche Hilfe, ich finde Ihre Antwort sehr interessant. nach Ihrer Frage, welche spezifischen Probleme Sie konfrontiert, indem Sie Karte in Writer füllen: in der Tat ist es ein Design mater, weil ich andere ItemWriter in dem gleichen Paket verwendet, um Datum als aussetzen auf CSV-Dateien zu füllen. daher möchte ich nicht, dass sie mit dem von mir verwendeten Element verwechselt werden, das ich verwendet habe, um Elemente in Map zu füllen, da sie eigentlich nicht so schreiben, wie sie im Speicher ablegen. –

+0

ywc ... Schreiben sollte nicht verwechselt werden, wenn es im Speicher schreibt oder dauerhaft schreibt ... Schreiben bedeutet, dass das gelesene Element verarbeitet und bereit ist, gespeichert zu werden. Wenn Sie API-integrierte Writer verwenden, werden Sie es schwierig finden, sie im Reader zu speichern, da Sie nicht selbst die Methode 'read()' aufrufen. –

Verwandte Themen