Spring Batch - запись в два разных файла в зависимости от условия - PullRequest
0 голосов
/ 08 января 2019

Я хочу записать данные в два разных файла. Если мое условие истинно, то пишите в x файл, иначе в y file.

В настоящее время у меня есть средство записи плоских файлов, которое записывает все данные в один файл. Я хочу указать два разных файла и на основе данных условия должен перейти в файл perticular.

<beans:bean id="itemWriter" class="org.springframework.batch.item.file.FlatFileItemWriter">
    <beans:property name="resource">
        <beans:bean class="org.springframework.core.io.FileSystemResource" scope="step">
            <beans:constructor-arg value="${process.output.dir}/${output.file.name}_#{jobParameters['run.id']}.${output.file.extension}" type="java.lang.String" />
        </beans:bean>
    </beans:property>
    <beans:property name="lineAggregator">
        <beans:bean class="org.springframework.batch.item.file.transform.DelimitedLineAggregator">
            <beans:property name="delimiter" value="|" />
            <beans:property name="fieldExtractor">
                <beans:bean class="com.abc.common.batch.item.file.transform.FormattingFieldExtractorDecorator">
                    <beans:property name="fieldExtractor">
                        <beans:bean class="org.springframework.batch.item.file.transform.BeanWrapperFieldExtractor" >
                            <beans:property name="names" value="${output.field.names}" />
                        </beans:bean>
                    </beans:property>
                    <beans:property name="defaultDateFormat" value="yyyyMMdd" />
                    <beans:property name="defaultDecimalFormat" value="############0.00" />
                </beans:bean>
            </beans:property>
        </beans:bean>
    </beans:property>
    <beans:property name="headerCallback">
        <beans:bean class="com.abc.common.batch.item.file.HeaderWriter">
            <beans:constructor-arg value="${output.column.names}" />
        </beans:bean>
    </beans:property>
    <beans:property name="footerCallback">
        <beans:bean class="com.abc.footer.ItemCountFooterCallback" >
            <beans:constructor-arg name="count" ref="itemCount" />
        </beans:bean>
    </beans:property>
</beans:bean>

Ответы [ 2 ]

0 голосов
/ 08 января 2019

вы определенно можете это сделать, вы можете реализовать собственный элемент записи, а затем, в зависимости от ваших условий, вы можете выполнить задачу записи в разные файлы.

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

Здесь я просто даю вам макет, вы можете написать реализацию записи в вашем файле, сначала напишите средство записи пользовательских элементов -

https://www.programcreek.com/java-api-examples/index.php?api=org.springframework.batch.item.ItemWriter

А затем реализовать пользовательский itemWriterListener - в котором с помощью метода beforeWrite вы можете установить другой ресурс

 public class WriteListener implements ItemWriteListener{

@Autowire
ItemWrite writer;

 public void beforeWrite(List items) {

   condition 1 (){
       writer.setResource(1)
   }

   condition 2 (){
       writer.setResource(2)
   }    
 }

 public void onWriteError(Exception exception, List items) {

    System.out.println("Error occurred when writing items!");
 }

 public void afterWrite(List items) {

 }  

 }
0 голосов
/ 08 января 2019

ClassifierCompositeItemWriter - это путь. Он использует Classifier для классификации элементов (это то место, где вы реализуете свое условие) и несколько пишущих элементов (каждый из них напишет определенный «класс» элементов).

Вы можете найти пример здесь .

Надеюсь, это поможет.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...