我基本上想要创建一个报告,其中包含在我的批处理中的每个步骤中过滤掉的项目。目前我可以看到有多少是使用spring-batch-admin过滤(和跳过),但我想要项目列表,以便我可以手动处理它们。
我的步骤遍历客户列表,并从第三方来源获取数据。我有用于获取数据的每个帐户的用户名+密码。客户端可能没有凭据。我在运行处理器之前过滤掉了那些。但客户端可能有错误的凭据(他错过了键入它们)然后我也想过滤它但“不同”。我不想跳过这些项目,因为我不想设置一个限制,之后我的工作将失败。即使所有这些都是空的或不正确的,我还是想继续下一个阶段。
我的chunk目前由数据库读取器,数据库编写器和CompositeItemProcessor
组成:
ItemProcessor
)并获取数据。如果这个错误凭据收到错误,它也会过滤该项(返回null)。我想做的是:
filterCount
字段中看到所有这些内容总结在一起
最好的方法是什么?我可以知道ItemProcessor
导致项目被过滤的内容吗?我知道有ItemListeners
在处理项目后得到通知,我应该以某种方式使用它们吗?如何将结果(已过滤的项目)存储到作业结束之前?
我试图在这个问题上寻找最佳实践,因为我不认为我是唯一一个在工作完成后尝试创建报告的人,但找不到任何有用的东西..
谢谢!
答案 0 :(得分:3)
解决此问题的最佳方法是从ItemProcessor中引发异常并将其过滤为跳过异常。然后使用SkipListener将它们写入另一个输出。将详细消息放在异常消息中,以便将其包含在输出中。将跳过限制设置为极高的值(例如999999)将阻止您的作业因跳过的数量而失败。
我在很多春季批次工作中都做得非常成功,这并不是一种罕见的模式。
如果您还有其他问题,请与我们联系!
答案 1 :(得分:1)
我面临着类似的情况,我决定使用的方法受到空对象模式的启发。我像往常一样通过返回null来过滤不需要的项目如果我找到一个我想要写的项目,但不同的是,我返回一个非null,但是一个具有特定状态的项目,在正常执行期间无法输入。当我的作家看到这一点时,它知道以不同的方式处理它。如果需要,可以设计null-state以向作者提供有关如何解释它的信息。
这有一些非常明显的缺点,但我认为最大的好处是它可以让你将spring框架的使用复杂性降到最低。
此外,您可以访问听起来像纯文本用户名和密码的事实让我感到担忧。