我有一个Spring批处理作业,其中ItemWriter发布到Web服务。我有一个输入文件,我必须转换并发布到Web服务,我没有直接访问数据库。
我的问题是,我该如何处理来自网络服务的失败回复?例如,如果我正在处理记录并将其发送到Web服务,但Web服务响应,“失败 - 找不到该ID”我应该如何在春季记录此记录失败(在商业意义上)批量?我希望抛出一个可跳过的异常,这样在Spring Batch Admin中会记录一个写入跳过,但是当我从项目编写器中抛出错误时,我会看到该块会自动回滚。然后,当块重新处理时,记录将再次发送到Web服务。
这种情况的建议是什么?有什么比将不良记录发送到另一个项目编写者,将其记录在一个单独的地方?或者有没有办法将其记录为写入跳过而不回滚?我意识到这在我们的应用程序中可能是一个更大的架构问题,并且愿意接受建议。
谢谢!
答案 0 :(得分:3)
当Spring Batch中的ItemWriter
内发生错误时,我们回滚整个块,将该块中的项目的commit-interval设置为1,然后逐个重试,以便我们识别出导致问题的单个项目(我们不知道第一次因为我们将项目列表传递给write方法)。虽然这适用于事务性ItemWriter
实现(以及我们可以解决的平面文件),但它显然存在非事务性选项的一些问题。另外需要注意的是,您可以关闭回滚,但这不是您的问题。并不是说你不能关闭回滚,它的回滚并没有做任何事情。关闭回滚仍将重试以前成功处理的项目。它只是表明再次写它们是可以的。
不知道您的完整用例(以及数量),我想到了几个选项:
ItemWriter
实现,因此您可以自行处理异常。只要你不把它扔出作家,Spring Batch就不会做任何事情。