2015-01-12 3 views
0

Я реализовал шаг в весенней партии, который считывает записи из базы данных и генерирует выходные файлы. Этот шаг разбит на разделы так, что каждый подчиненный шаг генерирует другой файл. Затем я выполнил шаг, который выполняется после подчиненных, и что он делает, это прочитать каждый из этих сгенерированных файлов и объединить их в один файл (слияние).Spring Batch: Заполните n файлов, но следующий шаг видит пустой

Проблема, с которой я столкнулась, заключается в том, что при запуске шага консолидации входные файлы пустые (вероятно, из-за того, что не было выполнено ни одного флеша), затем попытался настроить forceSync = true и transactional = false в подчиненном писателе, но без эффект.

Когда они завершают работу, файлы, сгенерированные подчиненными устройствами, содержат данные, а файл слияния пуст. Проблема заключается в том, что входные файлы пустые во время выполнения этапа консолидатора.

Может мне помочь ?, нужна дополнительная информация?

(простите за мой английский)

благодаря

<batch:job id="interfacesJob" xmlns=""> 
    <batch:step id="step.1" parent="readerParent" next="step.2"/> 
    <batch:step id="step.2" parent="merge"/> 
</batch:job> 

<batch:step id="readerParent"> 
    <batch:partition step="slave" partitioner="partitioner"> 
     <batch:handler grid-size="50" task-executor="poolTaskExecutor" /> 
    </batch:partition> 
</batch:step> 

<batch:step id="slave"> 
    <batch:tasklet 
     transaction-manager="transactionManager"> 
     <batch:chunk 
      reader="dummyReader" 
      processor="dummyProcessor" 
      writer="dummyWriter" 
      commit-interval="1" 
      skip-limit="50"> 
    </batch:tasklet> 
</batch:step> 

<bean id="dummyWriter" 
     class="org.springframework.batch.item.file.FlatFileItemWriter" 
     scope="step" > 
    <property name="resource" value="file:operations_#{stepExecutionContext[fromId]}.txt" /> 
    <property name="forceSync" value="true" /> 
    <property name="transactional" value="false" /> 
    <property name="lineAggregator"> 
     <bean class="org.springframework.batch.item.file.transform.DelimitedLineAggregator"> 
      <property name="delimiter" value="," /> <!-- default --> 
      <property name="fieldExtractor"> 
       <bean class="org.springframework.batch.item.file.transform.BeanWrapperFieldExtractor"> 
        <property name="names" value="id,field1,field2" /> 
       </bean> 
      </property> 
     </bean> 
     </property> 
</bean> 

<batch:step id="merge"> 
    <tasklet> 
     <chunk reader="mergeReader" writer="mergeWriter" commit-interval="1" /> 
    </tasklet> 
</batch:step> 

<bean id="mergeReader" 
     class="org.springframework.batch.item.file.FlatFileItemReader"> 
     <property name="resources" value="file:operations_*.txt" /> 
     <property name="lineMapper"> 
     <bean class="org.springframework.batch.item.file.mapping.DefaultLineMapper"> 
      <property name="lineTokenizer"> 
      <bean class="org.springframework.batch.item.file.transform.DelimitedLineTokenizer"> 
       <property name="delimiter" value="," /> 
      <property name="names" value="id,field1,field2" /> 
      </bean> 
       </property> 
       <property name="fieldSetMapper"> 
      <bean class="org.springframework.batch.item.file.mapping.BeanWrapperFieldSetMapper"> 
      <property name="prototypeBeanName" value="dummyPrototypeBean" /> 
      </bean> 
       </property> 
     </bean> 
     </property> 
</bean> 

<bean id="mergeWriter" 
     class="org.springframework.batch.item.file.FlatFileItemWriter"> 
     <property name="resource" value="file:final.txt" /> 
     <property name="lineAggregator"> 
    <bean class="org.springframework.batch.item.file.transform.DelimitedLineAggregator"> 
     <property name="delimiter" value="," /> 
     <property name="fieldExtractor"> 
      <bean class="org.springframework.batch.item.file.transform.BeanWrapperFieldExtractor"> 
       <property name="names" value="id,field1,field2" /> 
      </bean> 
     </property> 
    </bean> 
     </property> 
</bean> 

я пробую с MultiResourceItemReader для mergeReader, но по-прежнему продолжают с той же проблемой:

<bean id="mergeReader" 
class="org.springframework.batch.item.file.MultiResourceItemReader"> 
    <property name="resources" value="file:operations_*.txt" /> 
    <property name="delegate" ref="mergeReaderSpecific" /> 
</bean> 



<bean id="mergeReaderSpecific" 
     class="org.springframework.batch.item.file.FlatFileItemReader"> 
     <property name="lineMapper"> 
      <bean class="org.springframework.batch.item.file.mapping.DefaultLineMapper"> 
       <property name="lineTokenizer"> 
        <bean class="org.springframework.batch.item.file.transform.DelimitedLineTokenizer"> 
         <property name="delimiter" value="," /> 
         <property name="names" value="id,field1,field2" /> 
        </bean> 
       </property> 
       <property name="fieldSetMapper"> 
        <bean class="org.springframework.batch.item.file.mapping.BeanWrapperFieldSetMapper"> 
         <property name="prototypeBeanName" value="dummyPrototypeBean" /> 
        </bean> 
       </property> 
      </bean> 
     </property> 
</bean> 

ответ

0

Вероятно, вы должны используйте MultiResourceItemReader как mergeReader, используя делегат FlatFileItemReader.
FlatFileItemReader.resource свойство предназначено для использования на одном ресурсе, противоположном MultiResourceItemReader.resources (множественное число).

+0

ОК, я пробовал с помощью MultiResourceItemReader для mergeReader, но все равно продолжаю с той же проблемой ... Я на Windows 7 ... могу влиять? –

Смежные вопросы