Spring Batch中write_count小于read_count且各类计数为0的成因咨询
针对你遇到的作业成功完成但write_count有时小于read_count,且filter_count、各类skip_count均为0的问题,结合你使用ClassifierCompositeItemWriter的场景,可能的成因及排查点如下:
分类器逻辑未覆盖所有数据
如果你的分类器(Classifier)没有为所有OutputTransaction实例匹配到对应的Writer,这部分未被分配的数据会被静默丢弃,不会触发任何过滤或跳过逻辑。Spring Batch仅统计实际被Writer处理的数量,因此会出现write_count小于read_count的情况。
排查:检查分类器的判断逻辑,确保所有OutputTransaction都能命中至少一个Writer分支,没有遗漏的边界情况。Writer内部静默丢弃数据
若某个业务Writer在处理数据时,因内部业务判断(如数据不符合写入条件)直接跳过写入,但未抛出异常或通知Spring Batch,这部分数据不会被计入write_count,但也不会触发跳过计数。
排查:检查两个Writer的实现代码,看是否存在不抛出异常就丢弃数据的逻辑,比如条件判断后直接return而不执行写入操作。Listener修改Chunk数据集合
你配置了两个Step Listener(adjustTransactionItemWriter和adjustTransactionItemLogFileWriter),如果其中某个Listener的beforeWrite方法修改了待写入的item集合(比如移除元素),Writer实际处理的数量会少于read_count,但Spring Batch的统计计数不会同步更新,导致write_count偏低,且无其他异常计数。
排查:检查两个Listener的beforeWrite、afterWrite方法,确认是否有修改item集合的操作。ClassifierCompositeItemWriter配置错误
如果classifierCompositeItemWriter()方法中,分类器返回了null或者未正确注册的Writer实例,Spring Batch不会抛出异常,但对应的数据不会被写入。这种情况下未被处理的数据不会被统计到任何计数中。
排查:验证分类器返回的Writer是否均为已正确配置并注册的实例,检查ClassifierCompositeItemWriter的初始化代码,确保所有分支的Writer都已添加到组合Writer中。
内容的提问来源于stack exchange,提问作者Reza Shirin Nezhad

