Spring 批处理 - 是否可以在 spring 批处理中编写自定义重启
Spring Batch - Is it possible to write a custom restart in spring batch
我一直在编写 spring 批处理,其中我必须执行一些错误处理。
我知道 spring 批处理有自己的处理错误和重新启动的方式。
但是,当批处理失败并再次重新启动时,我想传递我自己的值、条件和参数(用于重新启动),这些值、条件和参数(用于重新启动)需要在 starting/executing 第一步之前遵循。
那么,是否可以spring批量编写这样的自定义重启?
更新 1:(为上述问题提供更好的解释。)
假设我在第 1 步中 reader 的输入格式如下:
Table 以下列:
CompanyName1 -> VehicleId1
CN1 -> VID2
CN1 -> VID3
.
.
CN1 -> VID30
CN2 -> VID1
CN2 -> VID2
.
.
CNn -> VIDn
reader 逐行读取此 table 块大小 1(因此在这种情况下检索的行将是 CN -> VID)处理它并将其写入文件对象.
这个过程一直持续到所有的 CN1 类型数据都写入到 File 对象中。当 reader 发送公司名称类型为 CN2 的行时,先前创建的文件对象(针对类型为 CN1 的公司名称)将存储在远程位置。然后 CN2 的文件对象创建过程将继续,直到我们遇到 CN3,在这种情况下,CN2 文件对象将被发送到远程位置进行存储
并且该过程将继续。
现在,一旦你理解了这一点,这里有一个问题。
假设写入者当前正在为公司名称 2 (CN2) 写入数据,车辆 ID 为 VID20 (CN2 -> VID20)
在文件对象中。然后,由于某种原因我们不得不停止 job/the 作业失败。在这种情况下,将保存的实例将是 CN2 -> VID20。所以,下次作业运行时,将从CN2->VID20
开始
您可能已经猜到了,当文件对象被销毁时,写入文件对象的 CN2->VID20 之前的所有 19 个条目都被永久删除,并且这些条目从未通过文件发送到远程位置。
所以我的问题是:
有没有一种方法可以让我为批处理编写自定义重启,让作业从 CN2->VID1 而不是 CN2->VID20 开始?
如果你能想到任何其他方法来处理这种情况,那么也欢迎提出这样的建议。
既然要将每个公司的数据写在一个单独的文件中,我会使用公司名称作为作业参数。使用这种方法:
- 每个job会读取单个公司的数据并写入文件
- 如果作业失败,您可以重新启动它,它会从停止的地方继续(Spring批处理将在写入新数据之前将文件分类到最后已知的写入偏移量)。所以不需要自定义重启"policy".
- 不需要将chunk-size设置为1,这样效率不高。您可以通过这种方法使用合理的块大小
如果公司数量足够少,您可以手动 运行 个职位。否则,您总是可以使用 select distinct(company_name) from yourTable
之类的东西获得不同的值,并编写 script/loop 来启动具有不同参数的批处理作业。归根结底,让每个工作只做一件事,并且把它做好。
我一直在编写 spring 批处理,其中我必须执行一些错误处理。 我知道 spring 批处理有自己的处理错误和重新启动的方式。
但是,当批处理失败并再次重新启动时,我想传递我自己的值、条件和参数(用于重新启动),这些值、条件和参数(用于重新启动)需要在 starting/executing 第一步之前遵循。
那么,是否可以spring批量编写这样的自定义重启?
更新 1:(为上述问题提供更好的解释。)
假设我在第 1 步中 reader 的输入格式如下:
Table 以下列:
CompanyName1 -> VehicleId1
CN1 -> VID2
CN1 -> VID3
.
.
CN1 -> VID30
CN2 -> VID1
CN2 -> VID2
.
.
CNn -> VIDn
reader 逐行读取此 table 块大小 1(因此在这种情况下检索的行将是 CN -> VID)处理它并将其写入文件对象. 这个过程一直持续到所有的 CN1 类型数据都写入到 File 对象中。当 reader 发送公司名称类型为 CN2 的行时,先前创建的文件对象(针对类型为 CN1 的公司名称)将存储在远程位置。然后 CN2 的文件对象创建过程将继续,直到我们遇到 CN3,在这种情况下,CN2 文件对象将被发送到远程位置进行存储 并且该过程将继续。
现在,一旦你理解了这一点,这里有一个问题。
假设写入者当前正在为公司名称 2 (CN2) 写入数据,车辆 ID 为 VID20 (CN2 -> VID20) 在文件对象中。然后,由于某种原因我们不得不停止 job/the 作业失败。在这种情况下,将保存的实例将是 CN2 -> VID20。所以,下次作业运行时,将从CN2->VID20
开始您可能已经猜到了,当文件对象被销毁时,写入文件对象的 CN2->VID20 之前的所有 19 个条目都被永久删除,并且这些条目从未通过文件发送到远程位置。
所以我的问题是:
有没有一种方法可以让我为批处理编写自定义重启,让作业从 CN2->VID1 而不是 CN2->VID20 开始?
如果你能想到任何其他方法来处理这种情况,那么也欢迎提出这样的建议。
既然要将每个公司的数据写在一个单独的文件中,我会使用公司名称作为作业参数。使用这种方法:
- 每个job会读取单个公司的数据并写入文件
- 如果作业失败,您可以重新启动它,它会从停止的地方继续(Spring批处理将在写入新数据之前将文件分类到最后已知的写入偏移量)。所以不需要自定义重启"policy".
- 不需要将chunk-size设置为1,这样效率不高。您可以通过这种方法使用合理的块大小
如果公司数量足够少,您可以手动 运行 个职位。否则,您总是可以使用 select distinct(company_name) from yourTable
之类的东西获得不同的值,并编写 script/loop 来启动具有不同参数的批处理作业。归根结底,让每个工作只做一件事,并且把它做好。