我有几个不同的Spring Batch作业需要写入同一个平面文件。在平面文件中写出的数据顺序无关紧要。这些批处理作业可能同时运行。
FlatFileItemWriter是否合适?我担心的是,如果同时有多个作业尝试写入平面文件,数据可能会混合在一起。
答案 0 :(得分:1)
根据documentation,它不是线程安全的。因此,如果您有多个线程写入同一个文件,则必须实现自己的锁定机制。
答案 1 :(得分:0)
由于@dardo编写FlatFileItemWriter
不是线程安全的,因此您无法使用多个线程写入同一文件。
与实现自定义锁定机制不同的解决方案可能是写入不同的文件并创建一个新的最后一步,该工作是连接所有以前创建的文件。您可以重复使用原始作业(以创建文件作为步骤)将它们包裹起来JobStep
答案 2 :(得分:0)
您只需使用同步写入方法创建包装器即可。像这样:
public class SynchronizedWrapperWriter<T> implements ItemWriter<T>, ItemStream {
private ItemWriter<T> itemWriter;
private boolean isStream = false;
/**
* setzen des ItemWriter.
*/
public void setItemWriter(ItemWriter<T> itemWriter) {
this.itemWriter = itemWriter;
if (itemWriter instanceof ItemStream) {
isStream = true;
}
}
@Override
public void close() {
if (isStream) {
((ItemStream) itemWriter).close();
}
}
@Override
public void open(ExecutionContext executionContext) {
if (isStream) {
((ItemStream) itemWriter).open(new ExecutionContext());
}
}
@Override
public void update(ExecutionContext executionContext) {
}
@Override
public synchronized void write(List<? extends T> items) throws Exception {
itemWriter.write(items);
}
}