在 Spring 批处理应用程序中使用 BufferWriter 处理回滚

Handling rollback using BufferWriter in Spring Batch Applications

在我的用例中,我想使用缓冲区编写器来处理字符串的存储。

这是为了确保当读取出错时,缓冲区写入器能够处理回滚。

有没有这方面的例子或帮助,因为这是我第一次做 spring 启动应用程序。

谢谢!

除非您有事务性文件系统,否则您无法回滚磁盘 flush 操作。由于问题的难度,事务文件系统从未成为主流。 Microsoft 试图在 Java 世界中提供 one, but this was abandoned quickly. There used be a couple of APIs for that as well, like Apache commons-transaction,但由于缺乏事务性文件系统,这些不再得到维护。

ACID 兼容数据库是在常规文件系统之上添加事务语义的方式。 SQLite 是使用最广泛的一个,它是 IMO 的一个了不起的工程。您可以看到如何将 SQLite 用作 application file format.

这就是为什么 Spring Batch 无法真正回滚刷新操作的原因,这将我带到下一点它如何处理回滚..

i would like to use a buffer writer to handle the storing of strings. Only when the commit interval has been met, it will flush the writes

这已在 Spring 批处理提供的 FlatFileItemWriter 中实现,默认情况下使用 TransactionawareBufferedWriter。这个缓冲的写入器知道当前活动的事务,并在满足块大小时将项目刷新到磁盘之前缓冲项目。

在刷新缓冲区回滚事务这种不太可能的情况下,作业将被标记为失败,您可以重新启动它。重新启动时,Spring Batch 会将损坏的文件截断到最后一个已知的“好”字节偏移量,并重新开始对最后一个失败的块进行干净写入,然后从那里继续。