Spring Batch: динамический или вращающийся писатель
Я пытаюсь сделать следующую реализацию.
По причинам, связанным с размером, мне приходится разбивать выходной файл, например, на блоки по 10 тыс. Строк.
Итак, мне нужно выгрузить 10 КБ в файл «out1.csv», следующие 10 КБ в файл «out2.csv» и так далее.
С одним выходным файлом пакет схемы: блок с функцией чтения-процессора-записи выполняется легко и прямо.
Выходной поток открывается пакетно: потоки XML-раздела внутри фрагмента, поэтому я избегаю исключения «Writer должен быть открыт, прежде чем он может быть записан в».
Я хочу реализовать реализацию, избегающую этого строгого и предустановленного решения:
<batch:chunk reader="reader" writer="compositeWriter" commit-interval="10000" processor-transactional="false">
<batch:streams>
<batch:stream ref="writer1" />
<batch:stream ref="writer2" />
<batch:stream ref="writer3" />
.
.
.<batch:stream ref="writer20" />
</batch:streams>
</batch:chunk>
<bean id="writer1" class="org.springframework.batch.item.file.FlatFileItemWriter" scope="step">
<property name="resource" value="out1.csv" />
...
</bean>
<bean id="writer2" class="org.springframework.batch.item.file.FlatFileItemWriter" scope="step">
<property name="resource" value="out2.csv" />
...
</bean>
...
<!-- writer 20 -->
Предположим, что 20 писателей вполне достаточно. Я ищу решение для динамического создания средств записи вывода (возможно, программно), их открытия и исключения вышеуказанного исключения.
1 ответ
По причинам, связанным с размером, мне приходится разбивать выходной файл, например, на блоки по 10 тыс. Строк. Итак, мне нужно сбросить 10 КБ в файл «out1.csv», следующие 10 КБ в файл «out2.csv» и так далее.
Вы, кажется, используете
CompositeItemWriter
, но это не выход. Что вам нужно использовать, так это MultiResourceItemWriter, который позволяет разделить вывод по количеству элементов. В вашем случае вам нужно будет настроить
MultiResourceItemWriter
и установите
itemCountLimitPerResource
до 10.000. Вы также можете предоставить
ResourceSuffixCreator
чтобы настроить имена выходных файлов, например
out1.csv
,
out2.csv
, так далее.