Spring Batch:多个文件编写器的页脚回调未提供确切的计数

时间:2019-01-10 12:11:39

标签: spring spring-batch

如果项目编写者将2条记录写入文件A,将1条记录写入文件B,则两个文件(A和B)的预告片计数均为3。

我有一个阅读器,处理器和ClassifierCompositeItemWriter。在分类器中,我有两个项目编写器,它们提供有效输出,但页脚回调不正确。尽管记录计数不同,但两个文件预告片计数都相同。

<batch:job id="abc-job" parent="xyzJob">
    <batch:step id="inputfile">
        <batch:tasklet>
            <batch:chunk reader="itemReader" processor="itemProcessor" writer="itemWriter"  commit-interval="1000" >
                <batch:streams>
                    <batch:stream ref="AFileWriter"/>
                    <batch:stream ref="BFileWriter"/>
                </batch:streams>
            </batch:chunk>
        </batch:tasklet>
    </batch:step>
</batch:job>

<beans:bean id="itemWriter" class="org.springframework.batch.item.support.ClassifierCompositeItemWriter">
    <beans:property name="classifier" ref="classifier" />
</beans:bean>

<beans:bean id="classifier"  class="org.springframework.batch.classify.BackToBackPatternClassifier">
    <beans:property name="routerDelegate">
        <beans:bean class="com.abc.classifier.MyClassifier" />
    </beans:property>
    <beans:property name="matcherMap">
        <beans:map>
        <beans:entry key="A" value-ref="AFileWriter" />
        <beans:entry key="B" value-ref="BFileWriter" />
        </beans:map>
    </beans:property>
</beans:bean>

<beans:bean id="1FileWriter" parent="parentItemWriter1">
        <beans:property name="name" value="AFileWriter"/>
        <beans:property name="resource" ref="AFile"/>
</beans:bean>

<beans:bean id="2FileWriter" parent="parentItemWriter2">
        <beans:property name="name" value="BFileWriter"/>
        <beans:property name="resource" ref="BFile"/>
</beans:bean>

页脚回调-

public class ItemCountFooterCallback implements FlatFileFooterCallback
{
private AtomicInteger count;

public ItemCountFooterCallback(final AtomicInteger count)
{
    this.count = count;
}

public void writeFooter(final Writer writer) throws IOException
{
    writer.append("Trailer " + this.count.toString());
}
}

我希望A和B文件的预告片记录的输出是该特定文件的确切数字行。

1 个答案:

答案 0 :(得分:0)

footerCallback是在步骤级别注册的,因此它将使用步骤的write.count,即已写项目的总数(在您的情况下为3)。

您可以做的是为每个编写器(例如,writer1.countwriter2.count)和每个编写器上的set a footer callback(而不是步骤级别)具有一个写计数。每个页脚回调都应写入其附加到的编写器的项目计数。