java—为multiresourceitemwriter在写入多个文件时创建的所有文件指定页眉和页脚—spring批处理

bq3bfh9z  于 2021-07-24  发布在  Java
关注(0)|答案(1)|浏览(703)

我有一个批处理,它使用jdbcpagingitemreader从数据库中读取数据,在java类中处理数据库中的每条记录,然后使用flatfileitemwriter将其写入文件。它还使用 FlatFileFooterCallback 以及 FlatFileHeaderCallback 该作业运行良好,并作为输出提供以下格式的单个json文件:

{"informations":[
{
 "name" : "xxx",
 "adress" : "xxx"
  //a very complex json object (1000 lines)
},
{
   "name" : "xxx",
 "adress" : "xxx"
  //a very complex json object (1000 lines )
},

// Many objects
]}

请注意标题如下:

{"informations":[

页脚只是

]}

现在文件太大了,我想用 MultiResourceItemWriter 每个文件最多从数据库中读取1000行。
所以我配置了这个步骤,我使用了上面的第一个flatfileitemwriter,这个工作很好。因此,我有许多文件有1000条来自数据库的记录,但没有页眉和页脚 {"informations":[ 以及 ]} multiresourceitemwriter生成的所有文件都具有以下格式:

{
 "name" : "xxx",
 "adress" : "xxx"
  a very complex json object (1000 lines)
},
{
   "name" : "xxx",
 "adress" : "xxx"
  a very complex json object (1000 lines )
},
{
// many objects
}

如何为创建的所有文件添加页眉和页脚 MultiResourceItemWriter 写作的时候。
我发现一个答案是,我们不能将multiresourceitemwriter与具有 FlatFileFooterCallback 以及 FlatFileHeaderCallback Spring批版本<2.1。
将multiresourceitemwriter和flatfileitemwriter与页脚回调和堆栈溢出相结合时出现流关闭异常
我有个例外 java.lang.IllegalStateException: JsonWriter is closed 当你试图 Package 的时候 FlatFileItemWriterFlatFileHeaderCallback 在我的期末考试中 MultiResourceItemWriter 作家。
那么,有没有一种方法可以为创建的所有文件指定页眉和页脚 MultiResourceItemWriter 写入新文件时(拆分为多个文件)?有没有一种方法可以定义文件的模板 MultiResourceItemWriter 写进去?
如果没有,你能指导我这样做吗?
我想在最后,所有由multiresourceitemwriter创建的文件都在开头 {"informations":[ 最后呢 ]} ,所有文件内容都 Package 在json数组中 informations .
提前谢谢

gijlo24d

gijlo24d1#

如何在编写时为multiresourceitemwriter创建的所有文件添加页眉和页脚。
您需要在代理编写器上设置页眉/页脚回调。下面是一个简单的例子:

import java.io.IOException;
import java.io.Writer;
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.ItemReader;
import org.springframework.batch.item.ItemWriter;
import org.springframework.batch.item.file.FlatFileFooterCallback;
import org.springframework.batch.item.file.FlatFileHeaderCallback;
import org.springframework.batch.item.file.FlatFileItemWriter;
import org.springframework.batch.item.file.ResourceSuffixCreator;
import org.springframework.batch.item.file.builder.FlatFileItemWriterBuilder;
import org.springframework.batch.item.file.builder.MultiResourceItemWriterBuilder;
import org.springframework.batch.item.file.transform.PassThroughLineAggregator;
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;
import org.springframework.core.io.FileSystemResource;

@Configuration
@EnableBatchProcessing
public class MyJob {

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

    @Bean
    public ItemWriter<Integer> itemWriter() {
        FlatFileItemWriter<Integer> flatFileItemWriter = new FlatFileItemWriterBuilder<Integer>()
                .lineAggregator(new PassThroughLineAggregator<>())
                .name("itemsWriter")
                .headerCallback(writer -> writer.write("header"))
                .footerCallback(writer -> writer.write("footer"))
                .build();

        return new MultiResourceItemWriterBuilder<Integer>()
                .delegate(flatFileItemWriter)
                .resource(new FileSystemResource("items"))
                .itemCountLimitPerResource(5)
                .resourceSuffixCreator(index -> "-" + index + ".txt")
                .name("multiResourcesWriter")
                .build();
    }

    @Bean
    public Job job(JobBuilderFactory jobs, StepBuilderFactory steps) {
        return jobs.get("job")
                .start(steps.get("step")
                        .<Integer, Integer>chunk(5)
                        .reader(itemReader())
                        .writer(itemWriter())
                        .build())
                .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());
    }

}

这将生成两个文件 items-1.txt 以及 items-2.txt 包括以下内容:

header
1
2
3
4
5
footer

header
6
7
8
9
10
footer

我使用springbatchversion3.0.10.release
此版本不再维护,因此我建议您升级到最新和最棒的v4.3.1。上面的示例使用springbatchv4.3.1并按预期工作。

相关问题