【问题标题】:How to handle Web Service error responses in ItemWriter of Spring Batch?Spring Batch 的 ItemWriter 中如何处理 Web Service 错误响应?
【发布时间】:2014-09-17 15:39:51
【问题描述】:

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

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

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

谢谢!

【问题讨论】:

    标签: spring-batch spring-batch-admin


    【解决方案1】:

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

    不知道您的完整用例(以及数量),有几个选项会浮现在脑海中:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-07-15
      • 1970-01-01
      • 2017-10-14
      • 2014-04-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多