2017-02-05 2 views
0

Salut, j'utilise le lot de printemps pour la première fois. Mon cas d'utilisation est que je dois charger des données d'oracle db dans un fichier csv en utilisant Spring Boot et Spring Data. Je rencontre des difficultés pour configurer oracle db dans ItemReader. Est-ce que quelqu'un peut m'aider.Chargement des données dans un fichier CSV à partir d'Oracle Database en utilisant Spring Batch, boot et Spring Jpa

Voici mon code

@Configuration 
@EnableBatchProcessing 
public class BatchConfiguration { 

    @Autowired 
    public JobBuilderFactory jobBuilderFactory; 

    @Autowired 
    public StepBuilderFactory stepBuilderFactory; 

    @Autowired 
    public PersonAcctRepository personAcctRepository; 



    @Bean 
    public ItemWriter<CustomerInsr> writer(){ 

     FlatFileItemWriter<CustomerInsr> writer = new FlatFileItemWriter<CustomerInsr>(); 

     String exportFileHeader = "FIRST_NAM, MIDDLE_NAM, LAST_NAM"; 
     StringHeaderWriter headerWriter = new StringHeaderWriter(exportFileHeader); 
     writer.setHeaderCallback(headerWriter); 
     writer.setResource(new ClassPathResource("sample-data.csv")); 

     LineAggregator<CustomerInsr> lineAgg = createCustomerInsrAgg(); 
     writer.setLineAggregator(lineAgg); 



     return writer; 

    } 

    @Bean 
    public LineAggregator<CustomerInsr> createCustomerInsrAgg(){ 

     DelimitedLineAggregator<CaresCustomerInsr> deliAgg = new DelimitedLineAggregator<CustomerInsr>(); 
     deliAgg.setDelimiter(","); 

     FieldExtractor<CustomerInsr> fieldExtractor = createCustomerInsrExtractor(); 
     deliAgg.setFieldExtractor(fieldExtractor); 
     return deliAgg; 

    } 

    @Bean 
    public FieldExtractor<CustomerInsr> createCustomerInsrExtractor(){ 

     BeanWrapperFieldExtractor<CustomerInsr> fieldExtractor = new BeanWrapperFieldExtractor<CustomerInsr>(); 
     fieldExtractor.setNames(new String []{"firstName", "middleName", "lastName"}); 
     return fieldExtractor; 
    } 

    @Bean 
    public ItemReader<CustomerInsr> reader(){ 

     RepositoryItemReader<CustomerInsr> reader = new RepositoryItemReader<CustomerInsr>(); 
     reader.setRepository(personAcctRepository); 
     reader.setMethodName("findAll"); 
     return reader; 
    } 


    @Bean 
    public Job job(){ 

     return jobBuilderFactory.get("job") 
       .incrementer(new RunIdIncrementer()) 
       .flow(step()) 
       .end() 
       .build(); 

    } 


    @Bean 
    public Step step(){ 

     return stepBuilderFactory.get("step") 
       .<CustomerInsr, CustomerInsr> chunk(10) 
       .reader(reader()) 
       .writer(writer()) 
       .build(); 
    } 

} 
+0

Pouvez-vous élaborer, ce qui manque/faux. trace de la pile? –

+0

J'essaie de lire des données à partir d'oracle db, j'utilise des référentiels de données Spring (référentiel JPA, en utilisant la méthode findAll()). Je donne les propriétés de la base de données dans le fichier application.properties. Comment dois-je configurer la méthode (findAll()) et la source de données dans ItemReader –

Répondre

0

Votre cas d'utilisation est un que je rencontre souvent. Si souvent que j'ai écrit une petite application (démarrage de printemps, lot de printemps) pour permettre une implémentation avisée de votre cas d'utilisation.

Vous pouvez cloner the repo et ajouter votre pilote oracle manuellement. Après avoir ajouté le bon pilote, vous pouvez reconditionner l'application dans un nouveau fichier jar (si vous utilisez maven, utilisez la phase de construction du paquet).

Indiquez les informations d'identification de votre base de données et les paramètres de déchargement de vos données dans le fichier application.yml (fichier de configuration externe similaire à database.properties).

Je pris la liberté de vous fournir un exemple qui utilise CustomerInsr comme table et prenom, middleName et lastName que les colonnes que vous souhaitez décharger:

spring: 
    datasource: 
    url: jdbc:oracle:thin:@yoururl:yourport:yoursid 
    username: 
    password:   

output-dir: your/directory/target/ 
commit-interval: 10 
page-size: 10 
delimiter: "," 
quote: "\"" 
quote-escape: "\\" 
table-definitions: 
    - file-name: CustomerInsr.csv  
    select-query: "SELECT firstName, middleName, lastName" 
    from-query: "FROM CustomerInsr" 
    sort-column: firstName 

Exécuter le pot de la ligne de commande avec quelque chose comme:

java -jar jdbc-unload-1.0.0.jar --spring.config.location=c:\yourlocation\application.yml 

Si vous avez des questions s'il vous plaît n'hésitez pas à me demander.