Загрузчик данных с использованием Spring Batch — Partitioning

#java #transactions #spring-batch

#java #транзакции #spring-batch

Вопрос:

Я работаю над загрузчиком данных, который считывает плоский файл, некоторую обработку и запись в базу данных. dataloader.properties Файлы содержат значение

 LOAD=MM1,MM2,MM3,MM4,MM5...
  

Я должен прочитать этот файл свойств и, используя spring batch, partition step и partitioner , я хочу, чтобы все файлы внутри папки (MM1) выполняли чтение и запись в db параллельно, любая ошибка db для определенного файла должна откатывать содержимое этого файла, аналогично для других папок (MM2), как яя новичок в spring batch, я хочу знать, как выполнить позднюю привязку для папок и имен файлов в файле конфигурации XML, при необходимости соответствующего отката. Я также хочу поделиться данными на шаге раздела папки

Ниже приведена грубая конфигурация задания, которое выполняет это. является ли это правильным подходом в соответствии с вышеуказанным требованием?

 <!--  The Data Loading Configuration goes here  -->      

<job id="partition${jobname}Job" name="${jobname}" xmlns="http://www.springframework.org/schema/batch">
    <step id="exchangestep" next="filestep">
        <partition step="step1" partitioner="exchangepartitioner">
            <handler grid-size="999" task-executor="taskExecutor" />
        </partition>
    </step>
    <step id="filestep">
        <partition step="step1" partitioner="filepartitioner">
            <handler grid-size="99" task-executor="taskExecutor" />
        </partition>
    </step>
</job>

<bean id="folderpartitioner" class="org.springframework.batch.core.partition.support.MultiResourcePartitioner">
    <property name="resources" value="#${folder}" />
</bean>

<bean id="filepartitioner" class="org.springframework.batch.core.partition.support.MultiResourcePartitioner">
    <property name="resources" value="#${file}" />
</bean>

<bean id="taskExecutor" class="org.springframework.core.task.SyncTaskExecutor" />

<step id="step1" xmlns="http://www.springframework.org/schema/batch">
    <tasklet transaction-manager="transactionManager">
        <chunk writer="itemWriter" reader="itemReader" processor="itemProcessor" commit-interval="5000" />
    </tasklet>
</step>

<bean id="itemReader" scope="step" autowire-candidate="false" parent="itemReaderParent">
    <property name="resource" value="#{stepExecutionContext[fileName]}" />
</bean>

<bean id="multifileReader" class="org.springframework.batch.item.file.MultiResourceItemReader">
    <property name="resources" value="#${filename}" />
    <property name="delegate" ref="fileItemReader" />
</bean>

<bean id="fileItemReader" parent="itemReaderParent" />


<!--  CONFIGURE THE FLAT FILE ITEM READER TO READ INDIVIDUAL BATCH -->
<bean id="itemReaderParent" class="org.springframework.batch.item.file.FlatFileItemReader" abstract="true">
    <property name="lineMapper">
        <bean class="org.springframework.batch.item.file.mapping.DefaultLineMapper">
            <property name="lineTokenizer">
                <bean class="org.springframework.batch.item.file.transform.FixedLengthTokenizer">
                    <property name="names" value="${columns}" />
                    <property name="columns" value="${range}" />
                </bean>
            </property>
            <property name="fieldSetMapper">
                <bean class="org.springframework.batch.item.file.mapping.FieldSetMapper">
                    <property name="targetType" value="DataLoaderMapper" />
                </bean>
            </property>
        </bean>
    </property>
</bean>