gpt4 book ai didi

java - 写入多个文件时,为 MultiResourceItemWriter 创建的所有文件指定页眉和页脚 -spring batch

转载 作者:行者123 更新时间:2023-12-04 15:07:00 24 4
gpt4 key购买 nike

我有一个使用 JdbcPagingItemReader 从数据库读取的批处理,在 java 类中处理数据库中的每条记录,然后使用 FlatFileItemWriter 将其写入文件。 它还使用 FlatFileFooterCallbackFlatFileHeaderCallback 为该文件附加页眉和页脚

作业运行良好,它以这种格式输出一个 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 条记录,但没有页眉和页脚{"信息":[]}

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 创建的所有文件添加页眉和页脚。

我找到了一个答案,说我们不能将具有 FlatFileFooterCallbackFlatFileHeaderCallback 的 MultiResourceItemWriter 与 FlatFileItemWriter 与 spring batch 版本 <2.1 组合.

Stream closed exception when combining MultiResourceItemWriter and FlatFileItemWriter with footer callback和堆栈溢出帖子 stack-overflow-post-about-my-problem

我有这个异常 java.lang.IllegalStateException: JsonWriter is closed 在我最后的 中尝试用 FlatFileHeaderCallback 包装 FlatFileItemWriter MultiResourceItemWriter 编写器。

那么有没有办法在写入新文件(拆分为多个文件)时为 MultiResourceItemWriter 创建的所有文件指定页眉和页脚?有没有办法定义 MultiResourceItemWriter 写入的文件的模板?

如果不是,请指导我这样做好吗?

我想在最后,由 MultiResourceItemWriter 创建的所有文件都在开头{"informations":[ 和最后的 ]} ,所有的文件内容都被包裹在 json 数组 informations 中。

最佳答案

How could I add the header and the footer for all files created by MultiResourceItemWriter When writing.

您需要在委托(delegate)编写器上设置页眉/页脚回调。这是一个简单的例子:

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.txtitems-2.txt,内容如下:

header
1
2
3
4
5
footer

header
6
7
8
9
10
footer

I use spring batch version 3.0.10.RELEASE

此版本不再维护,因此我鼓励您升级到最新最好的 v4.3.1。上面的示例使用 Spring Batch v4.3.1 并按预期工作。

关于java - 写入多个文件时,为 MultiResourceItemWriter 创建的所有文件指定页眉和页脚 -spring batch,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65937150/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com