Spring пакетное чтение из нескольких файлов и запись в один файл - PullRequest
0 голосов
/ 16 июня 2020

У меня есть весенняя пакетная конфигурация, которая читает из нескольких файлов и записывает несколько файлов. Можно ли писать только в один файл, читая из нескольких. Допустим, я получаю огромный файл XML, я разбиваю XML на небольшие файлы, использую разделитель и параллельно читаю небольшие файлы. Но мне нужно записать все данные, прочитанные из разных небольших файлов xml, в один выходной файл. Возможно ли это с помощью Spring Batch? Я знаю, что это возможно, если синхронизировать писатель, но я ищу любой другой возможный способ Конфигурация задания

@Bean
    public Job job(final Step parser) {
        return jobBuilderFactory.get("JOB")
                .flow(parser)
                .end()
                .build();
    }

    @Bean
    public Step parser(final Step parserWorker, final Partitioner partitioner) {
        return stepBuilderFactory.get("parser")
                .partitioner("parser", partitioner)
                .step(parserWorker)
                .taskExecutor(taskExecutor())
                .build();
    }

    @Bean
    public Step parserWorker(
            final StaxEventItemReader reader,
            final FlatFileItemWriter<Employee> writer) {
        return stepBuilderFactory.get("parserWorker")
                .<Employee, Employee>chunk(Integer.parseInt(chunkSize))
                .reader(reader)
                .writer(writer)
                .build();
    }

    @Bean
    @StepScope
    public StaxEventItemReader<Employee> reader(final @Value("file:#{stepExecutionContext[file]}") Resource resource) {
        StaxEventItemReader<Employee> staxEventItemReader = new StaxEventItemReader<>();
        staxEventItemReader.setResource(resource);
        staxEventItemReader.setFragmentRootElementName("Employee");
        Jaxb2Marshaller unMarshaller = new Jaxb2Marshaller();
        unMarshaller.setClassesToBeBound(Employee.class);
        staxEventItemReader.setUnmarshaller(unMarshaller);
        return staxEventItemReader;
    }

    @Bean()
    public FlatFileItemWriter<Employee> fileWriter() {
        FlatFileItemWriter<Employee> fileWriter = new FlatFileItemWriter<>();
        fileWriter.setResource(new FileSystemResource("out.csv"));
        EmployeeAggregator lineAggregator = new EmployeeAggregator();
        fileWriter.setLineAggregator(lineAggregator);
        fileWriter.setLineSeparator(EMPTY_STRING);
        fileWriter.setHeaderCallback(new HeaderCallback());
        fileWriter.setFooterCallback(new FooterCallback());
        return innlesFileWriter;
    }

Я получаю ошибку org.springframework.batch.item.ItemStreamException: Output file was not created:

1 Ответ

1 голос
/ 17 июня 2020

У меня есть весенняя пакетная конфигурация, которая читает из нескольких файлов и записывает несколько файлов.

Вы можете создать дополнительный шаг, который объединяет выходные файлы. Поскольку выходной файл является плоским файлом, это можно сделать без каких-либо проблем (это было бы немного более проблематично, c, если бы выходной файл был файлом XML, поскольку вам нужно иметь дело с объявлением XML, заголовками, et c при слиянии файлов).

Другой способ - использовать промежуточную область (таблица, очередь, et c) и добавить шаг, который читает из промежуточной области и записывает в конечную файл.

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