java - FlatFileItemWriter - Writer 必须先打开,然后才能写入
问题描述
我有一个 SpringBatch 作业,我跳过所有重复的项目写入平面文件。
但是,只要有重复,FlatFileItemWriter 就会引发以下错误:
Writer must be open before it can be written to
以下是 Writer & SkipListener 配置 -
@Bean(name = "duplicateItemWriter")
public FlatFileItemWriter<InventoryFileItem> dupItemWriter(){
return new FlatFileItemWriterBuilder<InventoryFileItem>()
.name("duplicateItemWriter")
.resource(new FileSystemResource("duplicateItem.txt"))
.lineAggregator(new PassThroughLineAggregator<>())
.append(true)
.shouldDeleteIfExists(true)
.build();
}
public class StepSkipListener implements SkipListener<InventoryFileItem, InventoryItem> {
private FlatFileItemWriter<InventoryFileItem> skippedItemsWriter;
public StepSkipListener(FlatFileItemWriter<InventoryFileItem> skippedItemsWriter) {
this.skippedItemsWriter = skippedItemsWriter;
}
@Override
public void onSkipInProcess(InventoryFileItem item, Throwable t) {
System.out.println(item.getBibNum() + " Process - " + t.getMessage());
try {
skippedItemsWriter.write(Collections.singletonList(item));
} catch (Exception e) {
System.out.println(e.getMessage());
}
}
整个 Job 定义如下,我使用的是 SkipListener 中的 duplicateItemWriter。
@Bean(name = "fileLoadJob")
@Autowired
public Job fileLoadJob(JobBuilderFactory jobs, StepBuilderFactory steps,
FlatFileItemReader<inventoryFileItem> fileItemReader,
CompositeItemProcessor compositeItemProcessor,
@Qualifier(value = "itemWriter") ItemWriter<InventoryItem> itemWriter,
StepSkipListener skipListener) {
return jobs.get("libraryFileLoadJob")
.start(steps.get("step").<InventoryFileItem, InventoryItem>chunk(chunkSize)
.reader(FileItemReader)
.processor(compositeItemProcessor)
.writer(itemWriter)
.faultTolerant()
.skip(Exception.class)
.skipLimit(Integer.parseInt(skipLimit))
.listener(skipListener)
.build())
.build();
}
我也尝试将所有数据写入 FlatFileItemWriter - 这也不起作用。但是,如果写入数据库,则没有问题。
我使用的 Spring-Batch 版本是 - 4.3.3 我也提到了以下线程:
解决方案
这只是粗略的疏忽,我错过了 FlatFileItemWriter 需要一个流。我对提出这个问题感到有些失望,但我发布答案以防万一它对某人有所帮助。
stream(dupItemWriter)
解决方案就像在工作定义中添加一个一样简单。
FlatfileItemWriter 与 Compositewriter 示例
@Bean(name = "fileLoadJob")
@Autowired
public Job fileLoadJob(JobBuilderFactory jobs, StepBuilderFactory steps,
FlatFileItemReader<inventoryFileItem> fileItemReader,
CompositeItemProcessor compositeItemProcessor,
@Qualifier(value = "itemWriter") ItemWriter<InventoryItem> itemWriter,
@Qualifier(value = "duplicateItemWriter")FlatFileItemWriter<InventoryFileItem> dupItemWriter,
StepSkipListener skipListener) {
return jobs.get("libraryFileLoadJob")
.start(steps.get("step").<InventoryFileItem, InventoryItem>chunk(chunkSize)
.reader(FileItemReader)
.processor(compositeItemProcessor)
.writer(itemWriter)
.faultTolerant()
.skip(Exception.class)
.skipLimit(Integer.parseInt(skipLimit))
.listener(skipListener)
.stream(dupItemWriter)
.build())
.build();
}
推荐阅读
- python-3.x - 读取文件时跳过带有奇怪字符的行
- c# - 无法使用c#从Excel文件中删除空行
- java - 错误未从被调用服务传播到调用者服务
- javascript - 我如何编辑 Li 项目以使用 javascript 向其中添加文本
- optimization - 是否可以在 Google Apps 脚本中批量处理范围保护?
- java - 如何使用 Reactive Kafka 将字符串数据发送到 kafka 生产者?
- interrupt - STM8S UART TX 中断启用/禁用问题
- css - 无法在 kendo-treeview 中为 kendo-checkbox 应用 css 样式
- javascript - 为什么 function(){}.__proto__ === Function.prototype 和 Function.prototype === function(){}.__proto_ 返回不同的结果
- c++ - 如何在 C++ 中保留颜色深度的同时提取文件图标并另存为 .ico?