Spring Batch не вызывает ItemProcessor и ItemWriter в чанке - PullRequest
0 голосов
/ 07 февраля 2019

У меня есть приложение Spring Batch для получения файла на сервере Samba и создания нового файла в другой папке на том же сервере.Однако в потоке вызывается только ItemReader.В чем проблема?Спасибо.

Пакетная конфигурация:

@Configuration
@EnableBatchProcessing
public class BatchConfiguration extends BaseConfiguration {

    @Bean
    public ValeTrocaItemReader reader() {
        return new ValeTrocaItemReader();
    }

    @Bean
    public ValeTrocaItemProcessor processor() {
        return new ValeTrocaItemProcessor();
    }

    @Bean
    public ValeTrocaItemWriter writer() {
        return new ValeTrocaItemWriter();
    }

    @Bean
    public Job importUserJob(JobCompletionNotificationListener listener) throws Exception {
        return jobBuilderFactory()
                .get("importUserJob")
                .incrementer(new RunIdIncrementer())
                .repository(getJobRepository())
                .listener(listener)
                .start(this.step1())
                .build();
    }

    @Bean
    public Step step1() throws Exception {
        return stepBuilderFactory()
                .get("step1")
                .<ValeTroca, ValeTroca>chunk(10)
                .reader(this.reader())
                .processor(this.processor())
                .writer(this.writer())
                .build();
    }
}

Базовая конфигурация:

public class BaseConfiguration implements BatchConfigurer {

    @Bean
    @Override
    public PlatformTransactionManager getTransactionManager() {
        return new ResourcelessTransactionManager();
    }

    @Bean
    @Override
    public SimpleJobLauncher getJobLauncher() throws Exception {
        final SimpleJobLauncher simpleJobLauncher = new SimpleJobLauncher();
        simpleJobLauncher.setJobRepository(this.getJobRepository());
        return simpleJobLauncher;
    }

    @Bean
    @Override
    public JobRepository getJobRepository() throws Exception {
        return new MapJobRepositoryFactoryBean(this.getTransactionManager()).getObject();
    }

    @Bean
    @Override
    public JobExplorer getJobExplorer() {
        MapJobRepositoryFactoryBean repositoryFactory = this.getMapJobRepositoryFactoryBean();
        return new SimpleJobExplorer(repositoryFactory.getJobInstanceDao(), repositoryFactory.getJobExecutionDao(),
                repositoryFactory.getStepExecutionDao(), repositoryFactory.getExecutionContextDao());
    }

    @Bean
    public MapJobRepositoryFactoryBean getMapJobRepositoryFactoryBean() {
        return new MapJobRepositoryFactoryBean(this.getTransactionManager());
    }

    @Bean
    public JobBuilderFactory jobBuilderFactory() throws Exception {
        return new JobBuilderFactory(this.getJobRepository());
    }

    @Bean
    public StepBuilderFactory stepBuilderFactory() throws Exception {
        return new StepBuilderFactory(this.getJobRepository(), this.getTransactionManager());
    }
}

ValeTrocaItemReader:

@Configuration
public class ValeTrocaItemReader implements ItemReader<ValeTroca>{

    @Value(value = "${url}")
    private String url;

    @Value(value = "${user}")
    private String user;

    @Value(value = "${password}")
    private String password;

    @Value(value = "${domain}")
    private String domain;

    @Value(value = "${inputDirectory}")
    private String inputDirectory;

    @Bean
    @Override
    public ValeTroca read() throws MalformedURLException, SmbException, IOException, Exception {
        File tempOutputFile = getInputFile();

        DefaultLineMapper<ValeTroca> lineMapper = new DefaultLineMapper<>();
        lineMapper.setLineTokenizer(new DelimitedLineTokenizer() {
            {
                setDelimiter(";");
                setNames(new String[]{"id_participante", "cpf", "valor"});
            }
        });
        lineMapper.setFieldSetMapper(
                new BeanWrapperFieldSetMapper<ValeTroca>() {
            {
                setTargetType(ValeTroca.class);
            }

        });

        FlatFileItemReader<ValeTroca> itemReader = new FlatFileItemReader<>();
        itemReader.setLinesToSkip(1);
        itemReader.setResource(new FileUrlResource(tempOutputFile.getCanonicalPath()));
        itemReader.setLineMapper(lineMapper);
        itemReader.open(new ExecutionContext());

        tempOutputFile.deleteOnExit();
        return itemReader.read();
    }

Образец ItemProcessor:

public class ValeTrocaItemProcessor implements ItemProcessor<ValeTroca, ValeTroca> {

    @Override
    public ValeTroca process(ValeTroca item)  {
        //Do anything

        ValeTroca item2 = item;
        System.out.println(item2.getCpf());
        return item2;
    }

РЕДАКТИРОВАТЬ: - Пружинная загрузка 2.1.2.RELEASE - Пружинная партия 4.1.1.RELEASE

Ответы [ 2 ]

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

решено : Проблема заключалась в том, что, хотя я не использую никаких баз данных, весеннему пакету, хотя и настроенному на использование JobRepository в памяти, требуется база данных (обычно H2) для сохранения таблиц конфигурации., задания и т. д.

В этом случае зависимости JDBC и без H2 в pom.xml были отключены.Просто добавили их в проект и проблема была решена!

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

Глядя на вашу конфигурацию, вот пара замечаний:

  • BatchConfiguration выглядит хорошо.Это типичная работа с одним шагом, ориентированным на порцию.
  • BaseConfiguration - это конфигурация по умолчанию, которую вы получаете при использовании @EnableBatchProcessing без предоставления источника данных.Таким образом, этот класс можно удалить
  • Добавление @Configuration к ValeTrocaItemReader и пометка метода read() с помощью @Bean неверна.Это означает, что вы объявляете bean-компонент с именем read типа ValeTroca в контексте вашего приложения.Более того, ваш пользовательский ридер использует FlatFileItemReader, но не имеет добавленной стоимости по сравнению с FlatFileItemReader.Вы можете объявить читателя как FlatFileItemReader и настроить его по мере необходимости (ресурс, линейный преобразователь и т. Д.).Это также позволит избежать ошибки открытия контекста выполнения в методе read, что следует делать при инициализации считывателя или в методе ItemStream#open, если в читателе реализован ItemStream

Кроме того, из того, что вы поделились, я не вижу, почему процессор и устройство записи не называются.

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