Wie zum ausführen von mehrere spring-batch-Schritte in einem einzigen job

@Qualifier("billingJob")
@Bean
public Job billingJob(@Qualifier("fetchAgreementTasklet")Step fetchAgreementTasklet,
@Qualifier("fetchAgreementRecurringItemsTasklet") Step fetchAgreementRecurringItemsTasklet,
@Qualifier("fetchItemsHistoryTasklet") Step fetchItemsHistoryTasklet ,
@Qualifier("populateAgreementStep") Step populateAgreementStep,
@Qualifier("populateRecurringItemStep") Step populateRecurringItemStep ,
@Qualifier("populateRecurringItemHistoryStep") Step populateRecurringItemHistoryStep ) {

  return jobsBuilderFactory.get("billingJob")                                
           .incrementer(new RunIdIncrementer())
           .flow(fetchAgreementTasklet)
           .next(fetchAgreementRecurringItemsTasklet)
           .next(fetchItemsHistoryTasklet)

           .next(populateAgreementStep).next(populateRecurringItemStep)
           .next(populateRecurringItemHistoryStep)
           .end().build();
}

    @Qualifier("populateRecurringItemStep")
    @Bean
    public Step populateRecurringItemStep(
    @Qualifier("recurringItemReader") ItemReader<RecurringItemRaw> recurringItemReader,
    @Qualifier("recurringItemProcessor") ItemProcessor<RecurringItemRaw, RecurringItem> recurringItemProcessor,
    @Qualifier("recurringItemWriter") ItemWriter<RecurringItem> recurringItemWriter) {
       return stepBuilderFactory.get("populateRecurringItemStep")
        .<RecurringItemRaw, RecurringItem> chunk(10)
        .reader(recurringItemReader).processor(recurringItemProcessor)
        .writer(recurringItemWriter).build();
    } 

@Qualifier("recurringItemReader")
@Bean
public ItemReader<RecurringItemRaw> recurringItemReader() {
FlatFileItemReader<RecurringItemRaw> reader = new FlatFileItemReader<RecurringItemRaw>();
String file = salesforceConfiguration       .getFileLocation(SalesforceConfiguration.TYPE_AGREEMENT_ITEMS);
    LOG.info("::::::: Reading RecurringItem File ::::::: " + file);
    reader.setResource(new FileSystemResource(file));
    reader.setLinesToSkip(1);
    reader.setLineMapper(new DefaultLineMapper<RecurringItemRaw>() {
        {
            setLineTokenizer(new DelimitedLineTokenizer() {
                {
                    setNames(new String[] { "id", "name", "agreementId",
                            "cost", "quantity" });
                }
            });
            setFieldSetMapper(new BeanWrapperFieldSetMapper<RecurringItemRaw>() {
                {
                    setTargetType(RecurringItemRaw.class);
                }
            });
        }
    });
    return reader;
}

@Qualifier("recurringItemProcessor")
@Bean
public ItemProcessor<RecurringItemRaw, RecurringItem> recurringItemprocessor() {
return new RecurringItemProcessor();
}

@Qualifier("recurringItemWriter")
@Bean
public ItemWriter<RecurringItem> recurringItemWriter(DataSource dataSource) {
JdbcBatchItemWriter<RecurringItem> writer = new JdbcBatchItemWriter<RecurringItem>();
writer.setItemSqlParameterSourceProvider(new BeanPropertyItemSqlParameterSourceProvider<RecurringItem>());
writer.setSql(PostgresqlDBQuery.INSERT_RECURRING_ITEM_QRY);
writer.setDataSource(dataSource);
return writer;
}

recurringItemprocessor() wird verwendet, um konvertieren Sie die string-Werte in andere Formate

recurringItemWriter() wird verwendet, um den Datensatz einfügen in meine postgresql Datenbank

recurringItemReader() wird verwendet, um die csv-Datei liest.


Dies ist die Prozessor-Klasse
public class RecurringItemProcessor implementiert ItemProcessor {

private static final Logger LOG = Logger.getLogger(RecurringItemProcessor.class.getName());

@Override
public RecurringItem process(final RecurringItemRaw recurringItemRaw) throws Exception {
    LOG.info("Processing recurring item");
    final RecurringItem item = new RecurringItem(); 
    item.setId(recurringItemRaw.getId());
    item.setName(recurringItemRaw.getName());
    item.setAgreementId(recurringItemRaw.getAgreementId());
    if (recurringItemRaw.getCost().trim().isEmpty()){
        item.setCost(BigDecimal.ZERO);
    }
    else{
        item.setCost(new BigDecimal(recurringItemRaw.getCost())); 
    }
    if (recurringItemRaw.getQuantity().trim().isEmpty()){
        item.setQuantity(0);
    }else{
        item.setQuantity(new BigDecimal(recurringItemRaw.getQuantity()).intValue());
    }
    LOG.info(item.toString());
    return item;
}

}

Ich habe Problem mit "populateRecurringItemStep", wenn dieser Schritt ausgeführt in einer endloop.
Wie dieses Problem zu beheben ..
Ich bin mit dem spring-boot-keine xml-Konfigurationen ..

  • Hinzufügen Sie können auch populateRecurringItemStep-Konfiguration oder-Komponente?
  • Ich habe den code Hinzugefügt
  • Noch nichts, die Ringe die Glocke. Denke, man kann die post die volle Konfiguration und auch problematisch-reader, processor und writer.
  • Bitte haben Sie einen Blick ich jetzt den code Bearbeiten
  • Ihre Leser nicht nach dem ItemReader Vertrag. Wenn alle Elemente, die gelesen wurden, der Leser sollte den Wert null zurückgeben. Debug durch Ihre ItemReader. Es kann sein, das Lesen der gleichen Zeile über und über.
  • Lese ich Element für Element, so sollte es wieder der verarbeiteten Sache . Wenn ich null zurück, statt des Objekts wird es keine Elemente speichern in der Datenbank. In diesem Fall ist es nicht das Lesen der gleichen Zeile über und über, es wiederholt alle der Elemente, so will ich zu Ende, wenn alle Elemente gelesen werden..
  • Können Sie versuchen, lose fließen, sehe ich keine Notwendigkeit, Sie mit Schritten, die nacheinander ausgeführt, so versuchen Sie es zu verlieren und auch Ende() am Ende. Long shot, aber kann problem, ich sehe nicht, etwas anderes seltsam.
  • Können Sie sehen, was die Leser wieder? Ein Schritt gilt als abgeschlossen, wenn der Leser den Wert null zurück. Wenn es nie null zurück...es wird nie enden.

InformationsquelleAutor Charitha | 2015-03-24
Schreibe einen Kommentar