6.13.2 自定义 ItemWriter 示例
自定义实现 ItemWriter
和上一小节所讲的 ItemReader
有很多方面是类似, 但也有足够多的不同之处。 但增加可重启特性在本质上是一样的, 所以本节的示例就不再讨论这一点。和 ItemReader
示例一样, 为了简单我们使用的参数也是 List
:
public class CustomItemWriter<T> implements ItemWriter<T> {
List<T> output = TransactionAwareProxyFactory.createTransactionalList();
public void write(List<? extends T> items) throws Exception {
output.addAll(items);
}
public List<T> getOutput() {
return output;
}
}
让 ItemWriter
支持重新启动
要让 ItemWriter
支持重新启动,我们将会使用和 ItemReader
相同的过程, 实现并添加 ItemStream
接口来同步 execution context。 在示例子中我们可能要记录处理过的items数量,并添加为到 footer 记录。 我们可以在 ItemWriter
的实现类中同时实现 ItemStream
, 以便在 stream 重新打开时从执行上下文中取回原来的数据重建计数器。
实际开发中, 如果自定义 ItemWriter restartable(支持重启),则会委托另一个 writer(例如, 在写入文件时), 否则会写入到关系型数据库(支持事务的资源)中, 此时 ItemWriter 不需要 restartable特性,因为自身是无状态的。 如果你的 writer 有状态, 则应该实现2个接口: ItemStream
和 ItemWriter
。 请记住, writer客户端需要知道 ItemStream 的存在, 所以需要在 xml 配置文件中将其注册为 stream.