4

我基本上想创建一个报告,其中包含在我的批次的每个步骤中被过滤掉的项目。目前我可以看到有多少被 spring-batch-admin 过滤(和跳过),但我想要项目列表,以便我可以手动处理它们。

我的步骤遍历客户列表,并从第三方来源获取有关他们的数据。我用于获取数据的每个帐户都有用户名+密码。客户端可能没有凭据。我在运行处理器之前过滤它们。但是客户可能有错误的凭据(他输错了),然后我也想过滤它,但“不同”。我不想跳过这些项目,因为我不想设置一个限制,之后我的工作就会失败。即使它们都是空值或不正确的,我也想继续下一个阶段。

我的块目前包括一个数据库读取器、数据库写入器和一个CompositeItemProcessor

  • 验证客户端是否有凭据并过滤掉那些没有的。
  • 运行数据增强器(另一个ItemProcessor)来获取数据。万一这一个因凭据错误而出错,它也会过滤该项目(返回 null)。

我想做的是:

  • 区分发生的两种“类型”过滤(在同一步骤)。filterCount目前,我在 spring-batch-admin的字段中看到所有这些都汇总在一起。
  • 发送包含针对每个案例过滤的客户端的报告,以便以后手动处理。我还想从几个步骤聚合过滤的项目,并在最后将它们一起发送。

最好的方法是什么?我可以知道是什么ItemProcessor导致该项目被过滤吗?我知道在ItemListeners处理项目后会收到通知,我应该以某种方式使用这些吗?我如何将结果(过滤的项目)存储到工作结束?

我试图寻找这个的最佳实践,因为我不认为我是唯一一个在他的工作运行后试图创建报告的人,但找不到任何有用的东西..

谢谢!

4

2 回答 2

4

解决此问题的最佳方法是从您的 ItemProcessor(s) 中引发异常并将其过滤为跳过异常。然后使用 SkipListener 将它们写入另一个输出。将您的详细消息放在异常消息中,以便您可以将其包含在输出中。将跳过限制设置为极高的值(例如 999999)将防止您的作业因跳过次数而失败。

我已经在相当多的 spring-batch 工作中非常成功地做到了这一点,这并不是一种罕见的模式。

如果您还有其他问题,请告诉我!

于 2013-07-12T12:23:58.587 回答
1

我面临着类似的情况,我决定使用的方法受到空对象模式的启发。我像往常一样通过返回 null 过滤不需要的项目。如果我发现一个我仍然想写的项目,但不同的是,我返回一个非空值,但它具有在正常执行期间无法进入的特定状态。当我的作家看到这一点时,它知道以不同的方式处理它。如果需要,可以设计空状态以向作者提供有关如何解释它的信息。

这有一些非常明显的缺点,但我认为最大的好处是它允许您将使用 Spring 框架的复杂性降至最低。

此外,您可以访问听起来像纯文本用户名和密码的事实让我担心。

于 2013-08-19T14:55:17.710 回答