Spring 批量 FlatFileItemReader 处理添加到 CSV 的附加字段
Spring Batch FlatFileItemReader Handle Additional Fields Added to CSV
所以我有一个按计划摄取的 csv 文件。 csv 文件有一组列,其名称在 header 行中指定,问题是,新列不断添加到此 csv。目前,当添加新字段时,摄取流程中断并且我得到 FlatFileParseException。我必须进入并使用新的列名更新代码才能让它再次工作。
我想要完成的是,当添加新列时,让代码正确地挑选出它需要的列,而不是抛出异常。
@Bean
@StepScope
FlatFileItemReader<Foo> fooReader(
...
) {
final DelimitedLineTokenizer fooLineTokenizer = new DelimitedLineTokenizer(",") {{
final String[] fooColumnNames = { "foo", "bar" };
setNames(fooColumnNames);
// setStrict(false);
}};
return new FlatFileItemReader<>() {{
setLineMapper(new DefaultLineMapper<>() {{
setLineTokenizer(fooLineTokenizer);
setFieldSetMapper(new BeanWrapperFieldSetMapper<>() {{
setTargetType(Foo.class);
}});
}});
...
}};
}
我试过在 lineTokenizer 中使用 setStrict(false),这消除了异常,但是问题变成了字段被设置为来自添加的新列的错误值,而不是从中提取数据的原始列。
关于如何向此流程添加更多 fault-tolerance 的任何想法,这样我就不必在每次将列添加到 csv 时不断更新 fooColumnNames
?
我尝试使用 setStrict(false) 参数修改代码并尝试使用 lineTokenizer 的自定义实现,但在将新列添加到 csv
时仍然难以获得 fault-tolerance
我不知道容错,但可以动态检索列
向您的步骤添加一个侦听器以检索 beforeStep 中的列并将其传递给您的 stepExecutionContext
public class ColumnRetrieverListener implements StepExecutionListener {
private Resource resource;
//Getter and setter
@Override
public void beforeStep(StepExecution stepExecution) {
String[] columns = getColumns();
stepExecution.getExecutionContext().put("columns", columns);
}
private String[] getColumns() {
//Parse first line of resource to get columns
}
}
使用传递给执行上下文的数据来设置 lineTokenizer
final DelimitedLineTokenizer fooLineTokenizer = new DelimitedLineTokenizer(",") {{
final String[] fooColumnNames = (String[]) stepExecution.getExecutionContext().get("columns");
setNames(fooColumnNames);
}};
所以我有一个按计划摄取的 csv 文件。 csv 文件有一组列,其名称在 header 行中指定,问题是,新列不断添加到此 csv。目前,当添加新字段时,摄取流程中断并且我得到 FlatFileParseException。我必须进入并使用新的列名更新代码才能让它再次工作。
我想要完成的是,当添加新列时,让代码正确地挑选出它需要的列,而不是抛出异常。
@Bean
@StepScope
FlatFileItemReader<Foo> fooReader(
...
) {
final DelimitedLineTokenizer fooLineTokenizer = new DelimitedLineTokenizer(",") {{
final String[] fooColumnNames = { "foo", "bar" };
setNames(fooColumnNames);
// setStrict(false);
}};
return new FlatFileItemReader<>() {{
setLineMapper(new DefaultLineMapper<>() {{
setLineTokenizer(fooLineTokenizer);
setFieldSetMapper(new BeanWrapperFieldSetMapper<>() {{
setTargetType(Foo.class);
}});
}});
...
}};
}
我试过在 lineTokenizer 中使用 setStrict(false),这消除了异常,但是问题变成了字段被设置为来自添加的新列的错误值,而不是从中提取数据的原始列。
关于如何向此流程添加更多 fault-tolerance 的任何想法,这样我就不必在每次将列添加到 csv 时不断更新 fooColumnNames
?
我尝试使用 setStrict(false) 参数修改代码并尝试使用 lineTokenizer 的自定义实现,但在将新列添加到 csv
时仍然难以获得 fault-tolerance我不知道容错,但可以动态检索列
向您的步骤添加一个侦听器以检索 beforeStep 中的列并将其传递给您的 stepExecutionContext
public class ColumnRetrieverListener implements StepExecutionListener {
private Resource resource;
//Getter and setter
@Override
public void beforeStep(StepExecution stepExecution) {
String[] columns = getColumns();
stepExecution.getExecutionContext().put("columns", columns);
}
private String[] getColumns() {
//Parse first line of resource to get columns
}
}
使用传递给执行上下文的数据来设置 lineTokenizer
final DelimitedLineTokenizer fooLineTokenizer = new DelimitedLineTokenizer(",") {{
final String[] fooColumnNames = (String[]) stepExecution.getExecutionContext().get("columns");
setNames(fooColumnNames);
}};