如何在spring-batch中创建过滤项目的报告?

时间:2012-10-21 15:51:49

标签: spring spring-batch

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

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

我的chunk目前由数据库读取器,数据库编写器和CompositeItemProcessor组成:

  • 验证客户端是否具有凭据并过滤掉那些没有凭据的人。
  • 运行数据增强器(另一个ItemProcessor)并获取数据。如果这个错误凭据收到错误,它也会过滤该项(返回null)。

我想做的是:

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

最好的方法是什么?我可以知道ItemProcessor导致项目被过滤的内容吗?我知道有ItemListeners在处理项目后得到通知,我应该以某种方式使用它们吗?如何将结果(已过滤的项目)存储到作业结束之前?

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

谢谢!

2 个答案:

答案 0 :(得分:3)

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

我在很多春季批次工作中都做得非常成功,这并不是一种罕见的模式。

如果您还有其他问题,请与我们联系!

答案 1 :(得分:1)

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

这有一些非常明显的缺点,但我认为最大的好处是它可以让你将spring框架的使用复杂性降到最低。

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