Весенняя загрузка чтения CSV-файла с использованием «FlatFileItemReader» в методе Service - PullRequest
0 голосов
/ 06 февраля 2019

Я собираюсь разработать приложение, в котором я пытаюсь прочитать CSV-файл, используя объект Spring FlatFileItemReader.Мне нравится использовать Сервис, где будет вызываться метод для выполнения процесса чтения.Но я не использую напрямую объект bean-компонента конфигурации FlatFileItemReader и других.Пример моего прототипа ниже.

public void executeCsvReading(){

    FlatFileItemReader<SomeModel> reader = new FlatFileItemReader<SomeModel>();

    reader.setResource(new ClassPathResource("someFile.csv"));

    reader.setLineMapper(new DefaultLineMapper<SomeModel>() {
        {

            setLineTokenizer(new DelimitedLineTokenizer() {
                {
                    setNames(new String[] { "somefield1", "somefield2" });
                }
            });

            setFieldSetMapper(new BeanWrapperFieldSetMapper<SomeModel>() {
                {
                    setTargetType(SomeModel.class);
                }
            });
        }
    });

// But how do I start this Job?
   Job job = jobBuilderFactory
            .get("readCSVFilesJob")
            .incrementer(new RunIdIncrementer())
            .start(step)
            .build();

   Step step = stepBuilderFactory.get("step1").<SomeModel, SomeModel>chunk(5)
            .reader(reader)
            .writer(new WriteItemsOn()) // Call WriteItemsOn class constructor
            .build();
}

public class WriteItemsOn implements ItemWriter<User> {

    @Override
    public void write(List<? extends SomeModel> items) throws Exception {
        // TODO Auto-generated method stub
        for (SomeModel item : items) {
            System.out.println("Item is " + item.someMethod()");
        }
    }
}

1 Ответ

0 голосов
/ 06 февраля 2019

// Но как мне запустить это задание?

Чтобы запустить задание, вам нужно использовать JobLauncher.Например:

SimpleJobLauncher jobLauncher = new SimpleJobLauncher();
//jobLauncher.setJobRepository(yourJobRepository);
//jobLauncher.setTaskExecutor(yourTaskExecutor);
jobLauncher.afterPropertiesSet();
jobLauncher.run(job, new JobParameters());

Однако при таком подходе вам нужно будет самостоятельно настроить компоненты инфраструктуры, необходимые для Spring Batch (JobRepository, JobLauncher и т. Д.).

Я бырекомендуем использовать типичную конфигурацию задания Spring Batch и запускать задание по методу executeCsvReading.Вот пример:

import org.springframework.batch.core.Job;
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.repeat.RepeatStatus;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

@Configuration
@EnableBatchProcessing
public class MyJob {

    private final JobBuilderFactory jobBuilderFactory;

    private final StepBuilderFactory stepBuilderFactory;

    public MyJob(JobBuilderFactory jobBuilderFactory, StepBuilderFactory stepBuilderFactory) {
        this.jobBuilderFactory = jobBuilderFactory;
        this.stepBuilderFactory = stepBuilderFactory;
    }

    @Bean
    public Step step() {
        return stepBuilderFactory.get("step")
                .tasklet((contribution, chunkContext) -> {
                    System.out.println("hello world");
                    return RepeatStatus.FINISHED;
                })
                .build();
    }

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

}

С этой конфигурацией задания вы можете загрузить контекст приложения Spring и запустить свое задание следующим образом:

public void executeCsvReading() {
   ApplicationContext context = new AnnotationConfigApplicationContext(MyJob.class);
   JobLauncher jobLauncher = context.getBean(JobLauncher.class);
   Job job = context.getBean(Job.class);
   jobLauncher.run(job, new JobParameters());
}

Обратите внимание, что загрузка приложения Springконтекст можно сделать вне метода executeCsvReading, чтобы он не загружался при каждом вызове этого метода.При таком подходе вам не нужно настраивать компоненты инфраструктуры, необходимые для Spring Batch, они будут автоматически созданы и добавлены в контекст приложения.Конечно, при необходимости их можно переопределить.

Heads up: Если вы добавите класс конфигурации MyJob в пакет приложения Spring Boot, Spring Boot по умолчанию выполнит задание при запуске.Вы можете отключить это поведение, добавив spring.batch.job.enabled=false в свойства своего приложения.

Надеюсь, это поможет.

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