我有一个用例,我可以使用弹簧批处理作业,我可以通过以下方式设计。
1)第一种方式:
Step1(面向块的步骤):从文件中读取—> 过滤、验证并将读取的行转换为 DTO(数据传输对象),如果有任何错误,将错误存储在 DTO 本身中 —> 检查是否有任何 DTO 有错误,如果没有写入数据库。如果是,则写入错误文件。
但是,这种方式的问题是 - 我需要事务边界中的整个 JOB。因此,如果任何块中出现故障,那么我不想写入 DB 并且想要回滚所有成功的写入直到 DB 中的那个点。如果任何块出现故障,上述方式迫使我为所有成功的写入编写回滚逻辑。
2) 第二种方式
第 1 步(面向块的步骤):从文件中读取项目 —> 过滤、验证和转换 DTO(数据传输对象)中的读取行。这确实将错误存储在 DTO 对象本身中。
第 2 步(Tasklet):读取从第 1 步创建的 DTO 的整个列表(而不是块)—> 检查是否有任何 DTO 在其中填充了错误。如果是,则中止对 DB 的写入并使 JOB 失败。
第二种方式,我得到了块处理和缩放的所有好处。同时,我为整个工作创建了事务边界。
PS:两种方式在他们的第一步都不会有任何步骤失败,如果有失败;错误存储在 DTO 对象本身中。因此,总是会创建 DTO 对象。
问题是- 由于我是 Spring 批次的新手,采用第二种方式是否是一个很好的模式。有没有一种方法可以在步骤之间共享数据,以便整个 DTO 列表可用于第二步(以上第二种方式)?