Spring Batch: обратный вызов нижнего колонтитула нескольких файловых писателей не дает точного подсчета - PullRequest
0 голосов
/ 10 января 2019

Если создатели элементов записывают 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 голосов
/ 11 января 2019

footerCallback зарегистрирован на уровне шага, следовательно, он будет использовать write.count шага, который представляет собой общее количество письменных элементов (3 в вашем случае).

Что вы можете сделать, так это установить счетчик записи для каждого писателя (например, writer1.count и writer2.count) и установить обратный вызов нижнего колонтитула для каждого писателя (не на уровне шага). Каждый обратный вызов нижнего колонтитула должен записывать количество элементов автора, к которому он прикреплен.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...