#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 записи в базе данных. Почему ?