3

我有一个春季批处理作业,其中 ItemWriter 发布到 Web 服务。我有一个必须转换并发布到 Web 服务的输入文件,我没有直接访问数据库的权限。

我的问题是,我应该如何处理来自 Web 服务的失败响应?例如,如果我正在处理一条记录并将其发送到 Web 服务,但 Web 服务响应,“失败 - 找不到该 id”我应该如何记录该记录在春季失败(在商业意义上)批?我希望抛出一个可跳过的异常,以便在 Spring Batch Admin 中记录写入跳过,但我看到当我从项目编写器抛出错误时,该块会自动回滚。然后当块被重新处理时,记录第二次被发送到 Web 服务。

对这种情况有什么建议?诸如将不良记录发送给另一个将其记录在单独位置的项目编写器之类的东西?或者有没有办法将其记录为写跳过而不回滚?我意识到这可能是我们应用程序中一个更大的架构问题,并且愿意接受建议。

谢谢!

4

1 回答 1

3

当 Spring Batch 中发生错误时ItemWriter,我们回滚整个块,将该块中的项目的提交间隔设置为 1,然后一个接一个地重试它们,以便我们可以识别导致问题的单个项目(我们不知道第一次,因为我们将项目列表传递给 write 方法)。虽然这适用于事务ItemWriter实现(以及我们可以像平面文件一样解决的那些),但它显然在非事务选项方面存在一些问题。要注意的另一件事是您可以关闭回滚,但这真的不是您的问题。不是你不能关闭回滚,而是回滚不做任何事情。关闭回滚仍然会重试之前成功处理的项目。它只是表明可以再次编写它们。

在不了解您的完整用例(以及数量)的情况下,可以想到几个选项:

  • 将块大小设置为 1 -对项目进行分块的主要驱动因素之一是您可以在写入时获得优化。批处理 JDBC 写入。将所有行写入单个块中的文件。但是,如果您必须为每个项目调用一次 Web 服务,则调用 Web 服务并不会带来这种好处。虽然您显然会对作业存储库的数据存储有更高的负载,但如果这不是问题,此选项将允许您使用 Spring Batch 提供的常规跳过/重试逻辑,而无需重新发送以前成功的消息。
  • 自行处理异常 -由于您显然已经编写了自己的ItemWriter实现,因此您可以自行处理异常。只要你不把它扔出作家,Spring Batch 不会做任何事情。
于 2014-09-17T16:39:58.083 回答