2017-07-07 4 views
0

J'ai deux fichiers différents, un délimité par un séparateur de tuyaux "|" et un par virgule ",". J'utilise Spring Batch pour traiter ces fichiers en utilisant FlatFileItemReader. Je ne veux pas avoir deux lecteurs et deux écrivains pour les fichiers. Puis-je avoir un FlatFileItemReader générique pour les deux fichiers?Spring Batch - FlatFileItemReader pour différents fichiers délimités

Les objets auxquels les fichiers seront mappés sont également différents.

Répondre

0

Vous pouvez injecter un DelimitedLineTokenizer dans le FlatFileItemReader et lui affecter la valeur du délimiteur. Les parties pertinentes de la configuration XML sont les suivantes:

<bean id="pipeDelimitedFileItemReader" class="org.springframework.batch.item.file.FlatFileItemReader"> 
    ... 
    <property name="lineMapper"> 
     <bean class="org.springframework.batch.item.file.mapping.DefaultLineMapper"> 
      <property name="lineTokenizer"> 
       <bean class="org.springframework.batch.item.file.transform.DelimitedLineTokenizer"> 
        ... 
        <property name="delimiter" value="|"/> 
       </bean> 
      </property> 
      ... 
     </bean> 
    </property> 
    ... 
</bean> 

Vous pouvez par ex. De même, configurez un autre bean commaDelimitedFileItemReader (la virgule est en fait la valeur du séparateur par défaut pour DelimitedLineTokenizer)

0

Vous pouvez injecter un DelimitedLineTokenizer et vous pouvez définir le délimiteur selon les besoins. vous pouvez le rendre générique en utilisant StepExecutionListener et avoir besoin de surcharger la méthode beforeStep(). Vous allez définir le délimiteur dans StepExecution. Lorsque vous analysez le fichier qui sont "," séparés, puis stepExecution.getExecutionContext(). PutString ("delimiter", ","); et lorsque le fichier est séparé par "|" puis stepExecution.getExecutionContext(). putString ("délimiteur", "|");

Mais vous devez créer deux travaux. Besoin de spécifier l'écouteur en conséquence.

Vous pouvez voir l'exemple d'expliquer ci-dessus la logique de Spring Batch on Walking Techie
Code pour lecteur générique:

@Bean 
    @StepScope 
    public FlatFileItemReader<Domain> reader(@Value("#{stepExecutionContext[delimiter]}") String delimiter) { 
    FlatFileItemReader<Domain> reader = new FlatFileItemReader<>(); 
    reader.setResource(new ClassPathResource("sample-data.csv")); 
    reader.setLineMapper(new DefaultLineMapper<Domain>() {{ 
     setLineTokenizer(new DelimitedLineTokenizer() {{ 
     setNames(new String[]{"id", "name"}); 
     setDelimiter(delimiter); 
     }}); 
     setFieldSetMapper(new BeanWrapperFieldSetMapper<Domain>() {{ 
     setTargetType(Domain.class); 
     }}); 
    }}); 
    return reader; 
    } 

Vous pouvez trouver les nombreux exemples sur lot de printemps en printemps de démarrage Spring Batch Tutorial. Vous trouverez ici toutes sortes de problèmes liés au lot de printemps.

0

J'ai créé un exemple de programme de démarrage printanier qui créera deux tâches qu'une tâche traitera pour lire les données du fichier CSV séparées par la virgule et d'autres tâches pour lire les données du fichier CSV séparées par le fichier CSV. pipe ("|"). Les deux travaux utilisent le même FlatFileItemReader commun pour lire les données à partir de fichiers CSV et MongoItemWriter pour écrire des données dans MongoDB.

Vous pouvez trouver l'explication et le code de travail de Spring Batch Example in Spring Boot - CSV Files with different delimiter to Mongo Database