如何处理Spring Batch的ItemWriter中的Web Service错误响应?

时间:2014-09-17 15:39:52

标签: spring-batch spring-batch-admin

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

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

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

谢谢!

1 个答案:

答案 0 :(得分:3)

当Spring Batch中的ItemWriter内发生错误时,我们回滚整个块,将该块中的项目的commit-interval设置为1,然后逐个重试,以便我们识别出导致问题的单个项目(我们不知道第一次因为我们将项目列表传递给write方法)。虽然这适用于事务性ItemWriter实现(以及我们可以解决的平面文件),但它显然存在非事务性选项的一些问题。另外需要注意的是,您可以关闭回滚,但这不是您的问题。并不是说你不能关闭回滚,它的回滚并没有做任何事情。关闭回滚仍将重试以前成功处理的项目。它只是表明再次写它们是可以的。

不知道您的完整用例(以及数量),我想到了几个选项:

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