Редактировать пакет для MultiResourceItemReader

#spring-batch

#spring-batch

Вопрос:

У меня есть пакет, который принимает входные аргументы, файл, подлежащий обработке, и дату обработки.

Считыватель относится к этому типу:

 <bean id="adherentsItemReader" class="org.springframework.batch.item.file.FlatFileItemReader" 
scope="step">
<property name="resource" value="#{jobParameters['inputResource']}"/>
<property name="lineMapper" ref="adherentsLineMapper"/>
</bean>

<bean id="adherentsLineMapper" class="org.springframework.batch.item.file.mapping.DefaultLineMapper">
<property name="lineTokenizer" ref="adherentsLineTokenizer"/>
<property name="fieldSetMapper" ref="adherentsFieldSetMapper"/>
</bean>


<bean id="adherentsLineTokenizer" 
 class="org.springframework.batch.item.file.transform.DelimitedLineTokenizer">
    <property name="delimiter" value="|"/>
    <property name="names" value="xxx,xx,xxx,xxx,xxx"/>
</bean>
  

Но произошли изменения. Один из входных файлов может содержать до 45 000 000 строк !!
Один из способов — разрезать этот файл на 45 файлов по 1 000 000 строк (но если у вас есть решение для чтения файла из 45 000 000 строк, мне интересно). Поэтому я должен изменить свой reader, чтобы читать несколько файлов .dat в качестве входных данных. Вот моя модификация:

 <?xml version="1.0" encoding="UTF-8"?>
<beans xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
   xmlns="http://www.springframework.org/schema/beans"
   xsi:schemaLocation="http://www.springframework.org/schema/beans
                    http://www.springframework.org/schema/beans/spring-beans.xsd">

<bean id="adherentsItemReader" class="org.springframework.batch.item.file.MultiResourceItemReader">
    <property name="resources" value="classpath:dat/ExamResult*.dat" />
    <property name="delegate" ref="flatFileItemReader" />
</bean>

<bean id="flatFileItemReader" class="org.springframework.batch.item.file.FlatFileItemReader" 
scope="step">
    <property name="lineMapper" ref="adherentsLineMapper"/>
</bean>

<bean id="adherentsLineMapper" class="org.springframework.batch.item.file.mapping.DefaultLineMapper">
    <property name="lineTokenizer" ref="adherentsLineTokenizer"/>
    <property name="fieldSetMapper" ref="adherentsFieldSetMapper"/>
</bean>

<bean id="adherentsLineTokenizer" 
class="org.springframework.batch.item.file.transform.DelimitedLineTokenizer">
    <property name="delimiter" value="|"/>
    <property name="names" value="xxx,xx,xxx,xxx,xxx"/>
</bean>

<!-- Bean s'occupant de mapper les données avec les champs définis par le  adherentLineTokenizer -->
<bean id="adherentsFieldSetMapper"
      class="fr.cnamts.stau.batch.adherents.step.importadherents.reader.AdherentsFiledSetMapper"/>

</beans>
  

Но при такой конфигурации пакет вылетает, как только я помещаю два файла во входной каталог. Почему ?
Другой вопрос, как сохранить входной параметр файлов (args [0]) при использовании MultiResourceItemReader?

Спасибо за ваши предложения и отзывы.

Cdt,

Комментарии:

1. the batch crashes as soon as I put two files in the input directory. Why ? Как это происходит сбой? У вас есть трассировка стека?

2. Привет, Махмуд. Я предоставил ответ чуть ниже. MultiResourceItemReader TaskExecutor не совпадают. Я теряю данные. Я пытаюсь настроить разделение, но у меня возникли небольшие проблемы. Идея заключалась бы в том, чтобы большой файл считывался, а затем разделялся, и каждый раздел мог обрабатывать 1 миллион строк. Как это сделать с помощью конфигурации xml? Спасибо.

3. FlatFileItemReader не является потокобезопасным, поэтому использовать его в качестве делегата MultiResourceItemReader на многопоточном шаге некорректно. У меня есть аналогичный пример, который разбивает файл и подсчитывает количество слов здесь: github.com/benas/spring-batch-lab/tree/master/issues/so53366710 . Тем не менее, он настроен на Java, я позволю вам адаптировать его к вашей конфигурации XML. Надеюсь, это поможет.

4. Спасибо Махмуд. У меня проблемы с переносом в XML. Я вижу принцип, но я не могу. Извините.

Ответ №1:

Я продвинулся в проблеме. Во входных файлах были ошибки. Все в порядке, учитываются два входных файла. Тем не менее, я активировал тасклет TaskExecutor для ускорения обработки.

         <step id="step_importAdherents">
        <!--<partition step="step1" partitioner="partitioner">
            <handler grid-size="2" task-executor="taskExecutor" />
        </partition>-->
        <tasklet task-executor="taskExecutor" throttle-limit="20">
            <chunk  reader="adherentsItemReader"
                    processor="adherentsItemProcessor"
                    writer="adherentsItemWriter" commit-interval="1">
                <listeners>
                    <listener ref="importAdherentsListener" />
                    <listener ref="readListener" />
                    <listener ref="writeListener" />
                </listeners>
            </chunk>
        </tasklet>
    </step>
<bean id="taskExecutor" 
class="org.springframework.core.task.SimpleAsyncTaskExecutor"/>
  

Когда я запускаю пакет с помощью этого тасклета, все данные не вставляются (всего два файла 24), либо у меня их 13, либо 7, это случайно. Если я удалю этот тасклет, у меня будет 24 записи в базе данных. Почему ?