2015-03-16 1 views
0

J'ai un éditeur personnalisé qui fonctionne bien; Cependant, je voudrais définir le nom de mon fichier de sortie via JobParameters au lieu d'utiliser une chaîne fixe dans ma configuration. Pour ce faire, j'ai ajouté l'annotation et les paramètres @StepScope, comme je l'ai fait avec mon ItemReader.WriterNotOpenException lors de l'utilisation de l'annotation StepScope dans Spring Batch

déclaration ItemWriter

@Bean 
@StepScope 
public ItemWriter<CityProcessed> writer(@Value("#{jobParameters[inputFile]}") String inputFile, @Value("#{jobParameters[outputFile]}") String outputFile) { 
    // String inputFile = "D:/cities.csv"; 
    // String outputFile = "D:/compterendu.csv"; 
    FlatFileItemWriter<CityCRE> writer = new FlatFileItemWriter<CityCRE>(); 
    FileSystemResource isr; 
    isr = new FileSystemResource(new File(outputFile)); 
    writer.setResource(isr); 
    DelimitedLineAggregator<CityCRE> aggregator = new DelimitedLineAggregator<CityCRE>(); 
    aggregator.setDelimiter(";"); 
    BeanWrapperFieldExtractor<CityCRE> beanWrapper = new BeanWrapperFieldExtractor<CityCRE>(); 
    beanWrapper.setNames(new String[]{ 
     "nom", "pays", "identifiantBase", "c/m" 
    }); 
    aggregator.setFieldExtractor(beanWrapper); 
    writer.setLineAggregator(aggregator); 
    CityItemWriter itemWriter = new CityItemWriter(); 
    writer.setFooterCallback(itemWriter); 
    writer.setHeaderCallback(itemWriter); 
    itemWriter.setDelegate(writer); 
    itemWriter.setInputFileName(inputFile); 
    return itemWriter; 
} 

Étape de déclaration

@Bean 
public Step stepImport(StepBuilderFactory stepBuilderFactory, ItemReader<CityFile> reader, ItemWriter<CityProcessed> writer, ItemProcessor<CityFile, CityProcessed> processor) { 
    return stepBuilderFactory 
     .get("step1") 
     .<CityFile, CityProcessed> chunk(10) 
     .reader(reader(null)) 
     .processor(processor) 
     .writer(writer(null, null)) 
     .build(); 
} 

Ce code ne fonctionne pas, je reçois un WriterNotOpenException à cause de la FlatFileItemWriter je l'utilise en tant que délégué.

J'ai eu la même erreur lorsque j'ai essayé d'utiliser JobParameters pour mon ItemReader, j'ai dû changer le type de retour à "FlatFileItemReader" (au lieu de ItemReader). Je ne peux pas faire la même chose ici parce que j'ai besoin de mon ItemWriter personnalisé et pas un simple FlatFileItemWriter.

Je ne comprends pas pourquoi j'obtiens cette erreur lorsque j'ajoute le @StepScope alors que mon lecteur n'a aucun problème sans cela. Qu'est-ce que je fais mal ?

Informations complémentaires:

  • Ma configuration a travaillé quand j'utilisais les cordes INPUTFILE et OUTPUTFILE.
  • Il semble que j'aie une erreur lorsque j'ajoute l'annotation @StepScope (même sans ajouter JobParameters en tant que mes paramètres d'écriture).

Répondre

0

Vous devez enregistrer le rédacteur délégué en tant que flux; De cette façon, SB gérera le cycle de vie du flux de la bonne manière.

+0

Cela fonctionne (merci), mais je ne comprends toujours pas pourquoi cela fonctionne quand je n'utilise que des chaînes fixes sans avoir à enregistrer le délégué en tant que flux. Y a-t-il une explication à cela? – Carrm

+0

Je ne peux pas vous aider pour cela, désolé :(Je suppose que l'enregistrement statique/étendu fonctionne différemment, mais @MMinella peut vous donner la bonne explication. –