【发布时间】:2017-11-14 15:28:40
【问题描述】:
我必须编写一个 Spring Batch 作业如下:
- 第 1 步:从文件系统加载 XML 文件并将其内容写入数据库临时表
- 第 2 步:调用 Oracle PL/SQL 过程来处理暂存表。
(欢迎对该工作结构发表评论,但不是问题)。
在第 1 步中,我想在加载 XML 文件后将其移动到另一个目录。我希望这尽可能与对临时表的写入“事务性”。也就是说,对暂存的写入和文件移动要么都成功,要么都不成功。
我觉得这是必要的,因为如果 (A) 暂存写入发生但文件没有移动,下一次运行将再次拾取文件并再次处理它,以及 (B) 如果文件被移动但暂存写入执行不会发生,那么我们将错过该文件的处理。
这个接口的要求都是关于健壮性。我知道我可以在最后放置一个步骤执行侦听器来移动所有文件,但我希望这种方法能够保证我们永远不会错过处理数据并且永远不会两次处理同一个文件。
部分困难在于我使用的是MultiResourceItemReader。我读到ChunkListener.beforeChunk() 作为块事务的一部分发生,所以我尝试制作一个自定义块CompletionPolicy 以在每次更改资源(文件)名称后强制块完成,但我无法让它工作。在任何情况下,我都需要一个afterChunk() 监听器,这无论如何都不是事务的一部分。
我将就我的具体问题提供任何指导,或者就如何在 Spring Batch 中稳健地处理文件(我只是在学习)进行专家解释。谢谢!
【问题讨论】:
标签: spring spring-batch batch-processing