2013-07-08 1 views
3

В этом вопросе говорится о моей проблеме. Можете ли вы не использовать FlatFileItemWriters (FFIW) в качестве писателей ни на чем, кроме простой обработки кусков с помощью одного писателя? Я новенький.Я получаю «Писатель должен быть открыт до его написания» при использовании ClassifierCompositeItemWriter

Я попытался ввести FFIW в ItemProcessors и получил то же самое. Возможно, мне нужно написать свои собственные писатели. Я пытался использовать FFIW для выполнения этой работы, потому что все, что мне нужно, - это просеять один входной файл и заполнить три файла. Мой маршрутизаторDelegate работает нормально, никаких проблем нет. Просто сбой при записи, потому что файл не открыт, и я не вижу, как его вручную открыть (что я считаю неправильным, даже если бы мог).

Благодаря ...

вот мой код:

<batch:step id="processCustPermits" next="somethingElse"> 
     <batch:description>Sift permits></batch:description> 
     <batch:tasklet> 
      <batch:chunk reader="custPermitReader" writer="custPermitCompositeWriter" 
       commit-interval="1" /> 
     </batch:tasklet> 
    </batch:step> 

<bean id="custPermitCompositeWriter" 
    class="org.springframework.batch.item.support.ClassifierCompositeItemWriter"> 
    <property name="classifier"> 
     <bean 
      class="org.springframework.batch.classify.BackToBackPatternClassifier"> 
      <property name="routerDelegate" ref="permitRouterClassifier" /> 
      <property name="matcherMap"> 
       <map> 
        <entry key="hierarchy" value-ref="custPermitWriter" /> 
        <entry key="omit" value-ref="custPermitOmithWriter" /> 
        <entry key="trash" value-ref="custPermitTrashWriter" /> 
       </map> 
      </property> 
     </bean> 
    </property> 
</bean> 
<bean id="custPermitWriter" class="org.springframework.batch.item.file.FlatFileItemWriter"> 
    <property name="resource" value="${sap.cust.permit.outfile.heirarchy}" /> 
    <property name="lineAggregator" ref="passThroughLineAggregator" /> 
    <property name="shouldDeleteIfExists" value="true" /> 
    <property name="shouldDeleteIfEmpty" value="false" /> 
</bean> 
<bean id="custPermitOmithWriter" class="org.springframework.batch.item.file.FlatFileItemWriter"> 
    <property name="resource" value="${sap.cust.permit.outfile.omits}" /> 
    <property name="lineAggregator" ref="passThroughLineAggregator" /> 
    <property name="shouldDeleteIfExists" value="true" /> 
    <property name="shouldDeleteIfEmpty" value="true" /> 
</bean> 
<bean id="custPermitTrashWriter" class="org.springframework.batch.item.file.FlatFileItemWriter"> 
    <property name="resource" value="${sap.cust.permit.outfile.trash}" /> 
    <property name="lineAggregator" ref="passThroughLineAggregator" /> 
    <property name="shouldDeleteIfExists" value="true" /> 
    <property name="shouldDeleteIfEmpty" value="true" /> 
</bean> 

ответ

6

Иногда вы просто должны внимательно прочитать реальное. Я добавил элемент Streams к элементу chunk и voila!

<batch:step id="processCustPermits" next="somethingElse"> 
    <batch:description>Sort out unwanted permits></batch:description> 
    <batch:tasklet> 
     <batch:chunk reader="custPermitReader" writer="custPermitCompositeWriter" 
      commit-interval="1"> 
      <batch:streams> 
       <batch:stream ref="custPermitWriter" /> 
       <batch:stream ref="custPermitOmithWriter" /> 
       <batch:stream ref="custPermitTrashWriter" /> 
      </batch:streams> 
     </batch:chunk> 
    </batch:tasklet> 
</batch:step> 
+0

Спасибо! Это просто помогло мне собрать кучу, когда вы говорите, что вам нужно внимательно читать, у вас есть ссылка на то, что вы читаете? – EdgeCaseBerg

+1

Я использовал манеру речи. Я нашел пример, но не достаточно внимательно прочитал его. Вставка элемента «поток» внутри «куска» была той частью, которую я делал неправильно. У меня было это вне этого элемента. Я прошу прощения, что прошло некоторое время, и у меня больше нет примера. Весенняя партия действительно полезна. Я рад, что этот пост помог в некотором роде. – Davidson

+0

Спасибо @ Davidson, это очень помогло мне. Большое спасибо – Shankar

2

Для тех, кто предпочитает конфигурацию Java для конфигурации XML, это делается следующим образом:

@Bean 
public Step processCustPermits(StepBuilderFactory stepBuilderFactory, 
     @Qualifier("custPermitReader") ItemReader<Wscpos> custPermitReader, 
     @Qualifier("custPermitCompositeWriter") ItemWriter<Wscpos> custPermitCompositeWriter, 
     @Qualifier("custPermitWriter") FlatFileItemWriter<Wscpos> custPermitWriter, 
     @Qualifier("custPermitOmithWriter") FlatFileItemWriter<Wscpos> custPermitOmithWriter, 
     @Qualifier("custPermitTrashWriter") FlatFileItemWriter<Wscpos> custPermitTrashWriter) 
{ 
    return stepBuilderFactory.get("processCustPermits") 
     .<Wscpos, Wscpos> chunk(1) 
     .reader(custPermitReader) 
     .writer(custPermitCompositeWriter) 
     .stream(writerCustodyMismatch) 
     .stream(writerNoMatch) 
     .stream(custPermitTrashWriter) 
     .build(); 
} 
+0

очень интересно. Спасибо. – Davidson

+2

Проблема, связанная с этим https://jira.spring.io/browse/BATCH-2097 –