自定义ItemReaders和ItemWriters - 自定义ItemWriter示例

优质
小牛编辑
130浏览
2023-12-01

6.13.2 自定义 ItemWriter 示例

自定义实现 ItemWriter 和上一小节所讲的 ItemReader 有很多方面是类似, 但也有足够多的不同之处。 但增加可重启特性在本质上是一样的, 所以本节的示例就不再讨论这一点。和 ItemReader 示例一样, 为了简单我们使用的参数也是 List:

  1. public class CustomItemWriter<T> implements ItemWriter<T> {
  2. List<T> output = TransactionAwareProxyFactory.createTransactionalList();
  3. public void write(List<? extends T> items) throws Exception {
  4. output.addAll(items);
  5. }
  6. public List<T> getOutput() {
  7. return output;
  8. }
  9. }

ItemWriter 支持重新启动

要让 ItemWriter 支持重新启动,我们将会使用和 ItemReader 相同的过程, 实现并添加 ItemStream 接口来同步 execution context。 在示例子中我们可能要记录处理过的items数量,并添加为到 footer 记录。 我们可以在 ItemWriter 的实现类中同时实现 ItemStream, 以便在 stream 重新打开时从执行上下文中取回原来的数据重建计数器。

实际开发中, 如果自定义 ItemWriter restartable(支持重启),则会委托另一个 writer(例如, 在写入文件时), 否则会写入到关系型数据库(支持事务的资源)中, 此时 ItemWriter 不需要 restartable特性,因为自身是无状态的。 如果你的 writer 有状态, 则应该实现2个接口: ItemStreamItemWriter。 请记住, writer客户端需要知道 ItemStream 的存在, 所以需要在 xml 配置文件中将其注册为 stream.