Spring Batch обрабатывает разные типы за один шаг - PullRequest
0 голосов
/ 28 сентября 2019

У меня есть пакетное задание, которое читает записи из файла.Я хочу преобразовать указанные записи в PojoA (все строки).Я хочу, чтобы каждая запись запускала валидатор, чтобы убедиться, что все поля присутствуют.Затем я хочу преобразовать PojoA в PojoB.У меня проблема в том, что я не могу изменить тип объекта в середине шага.

return getStepBuilder("downloadData")
        .<PojoA, PojoA>chunk(1000)
        .reader(pojoAReader())
        .processor(pojoAValidator)
        .writer(pojoAWriter)
        .processor(pojoAToPojoBTransformer) <- issue here, <PojoA, PojoB> 
        .write(pojoBWriter)
        .build();

Причина, по которой существует PojoB, заключается в том, что PojoA - это все строки;Я хочу сохранить все записи независимо от того, являются ли они недействительными.PojoB имеет точные типы данных, например, даты, числа.

Я думаю, что мне нужен еще один шаг, который касается, но как мне передать PojoA на шаг 2?

1 Ответ

0 голосов
/ 30 сентября 2019

Вы не можете объявить два процессора / записывающих устройства, например:

    .processor(pojoAValidator)
    .writer(pojoAWriter)
    .processor(pojoAToPojoBTransformer) <- issue here, <PojoA, PojoB> 
    .write(pojoBWriter)

Для этого вам нужно использовать составной процессор / записывающее устройство.

Вот краткий пример составного процессора с процессором1(Целое число -> Целое число), затем процессор2 (Целое число -> Строка):

import java.util.Arrays;

import org.springframework.batch.core.Job;
import org.springframework.batch.core.JobParameters;
import org.springframework.batch.core.Step;
import org.springframework.batch.core.configuration.annotation.EnableBatchProcessing;
import org.springframework.batch.core.configuration.annotation.JobBuilderFactory;
import org.springframework.batch.core.configuration.annotation.StepBuilderFactory;
import org.springframework.batch.core.launch.JobLauncher;
import org.springframework.batch.item.ItemProcessor;
import org.springframework.batch.item.ItemReader;
import org.springframework.batch.item.ItemWriter;
import org.springframework.batch.item.support.CompositeItemProcessor;
import org.springframework.batch.item.support.ListItemReader;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.ApplicationContext;
import org.springframework.context.annotation.AnnotationConfigApplicationContext;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

@Configuration
@EnableBatchProcessing
public class MyJob {

    @Autowired
    private JobBuilderFactory jobs;

    @Autowired
    private StepBuilderFactory steps;

    @Bean
    public ItemReader<Integer> itemReader() {
        return new ListItemReader<>(Arrays.asList(1, 2, 3, 4, 5, 6, 7, 8, 9, 10));
    }

    @Bean
    public ItemWriter<String> itemWriter() {
        return items -> {
            for (String item : items) {
                System.out.println("item = " + item);
            }
        };
    }

    @Bean
    public ItemProcessor<Integer, Integer> itemProcessor1() {
        return item -> item + 1;
    }

    @Bean
    public ItemProcessor<Integer, String> itemProcessor2() {
        return String::valueOf;
    }

    @Bean
    public ItemProcessor<Integer, String> compositeItemProcessor() {
        CompositeItemProcessor<Integer, String> compositeItemProcessor = new CompositeItemProcessor<>();
        compositeItemProcessor.setDelegates(Arrays.asList(itemProcessor1(), itemProcessor2()));
        return compositeItemProcessor;
    }

    @Bean
    public Step step() {
        return steps.get("step")
                .<Integer, String>chunk(5)
                .reader(itemReader())
                .processor(compositeItemProcessor())
                .writer(itemWriter())
                .build();
    }

    @Bean
    public Job job() {
        return jobs.get("job")
                .start(step())
                .build();
    }

    public static void main(String[] args) throws Exception {
        ApplicationContext context = new AnnotationConfigApplicationContext(MyJob.class);
        JobLauncher jobLauncher = context.getBean(JobLauncher.class);
        Job job = context.getBean(Job.class);
        jobLauncher.run(job, new JobParameters());
    }

}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...