【问题标题】:Pass parameters from Processor to Writer将参数从处理器传递到写入器
【发布时间】:2014-05-21 15:11:13
【问题描述】:

我有一个读取器、处理器和写入器的步骤,用于将数据写入文件。

根据处理的数据类型,我想将其写入不同的位置。

如何在运行时从读取器或处理器指定数据应写入的位置?

示例(可能是一个愚蠢的例子):

读取(项目)->处理(项目)>写入(到苹果文件夹)

读取(项目)->处理(项目)>写入(到番茄文件夹)

我不知道这些物品是按什么顺序来的,也不知道它们的类型。我只在阅读器和处理器中发现了这一点,但作者再次不知道它处理什么。

有没有办法实现这一点(例如 reader.getWriter().setAttribute() 或使用某种会话)?

【问题讨论】:

  • 好吧,我们是否应该假设给定提交间隔中的所有相同项目都将写入同一目录中?还是应该将同一个提交中的每个项目一个一个地写入不同的目录?
  • @ArnaudPotier 假设提交间隔中的所有项目都属于同一个目录。这是 100% 确定的。
  • @ArnaudPotier 另外,请查看我对 Michael Minella 回答的评论。它可能会让事情变得更清楚。

标签: java spring-batch


【解决方案1】:

Composition 是 Spring Batch 中的一个重要主题。在这种情况下,您需要实现一个复合 ItemWriter,它根据需要写入的位置委托给子 ItemWriters。你有两个选择,实现你自己的或者使用 Spring Batch 提供的ClassifierCompositeItemWriter。这实际上取决于您的选择过程的逻辑。您可以在此处的文档中阅读有关 ClassifierCompositeItemWriter 的更多信息:http://docs.spring.io/spring-batch/trunk/apidocs/org/springframework/batch/item/support/ClassifierCompositeItemWriter.html

使用此方法时的一个重要注意事项是委托ItemWriters 不会自动注册为ItemStreams。您需要手动执行此操作。你可以在这里阅读如何做到这一点:http://docs.spring.io/spring-batch/trunk/reference/htmlsingle/#delegatePatternAndRegistering

【讨论】:

  • 不幸的是,您的建议几乎是不可能的。让我提供更多细节。阅读器实际上是一个爬虫——它从硬盘中搜索每个文件夹并读取里面的文件。处理器分析信息,然后将所需的数据传递给编写器以继续。作者应将所有内容都放在源文件夹中(首先从中读取作业)。问题是,我有很多文件夹,我无法为每个文件夹制作一个作家。希望你现在明白我的需要。很抱歉一开始没有提供足够的细节。谢谢!
  • 这并没有真正改变我的答案。 FlatFileItemWriter 实现 ResourceAwareItemWriterItemStream,这将允许您实现包装器 ItemWriter 以根据输入设置资源。然而,有一些警告。首先是它实际上只能为每个块设置一次,因此您需要适当地设置块大小(可能为 1)。另一个需要注意的是,当您打开/关闭要写入的文件时,您会受到很大的性能影响。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-06-23
  • 1970-01-01
  • 2019-03-13
  • 1970-01-01
  • 2023-03-15
相关资源
最近更新 更多