How to set the resource of MultiResourceItemWriter dynamically from ItemReader in Spring Batch

dimzak

The batch job is:

  • Reading from a csv file

  • Create an xml file for every record(line) in the csv with name Patent.ID.xml(where ID is a field in the csv and Patent is my model class), example: 1.xml, 2.xml

The problem is that I can't find a way to dynamically set the file-name to each ID from the csv file

Here is my configuration:

<beans xmlns="http://www.springframework.org/schema/beans"
    xmlns:batch="http://www.springframework.org/schema/batch"xmlns:task="http://www.springframework.org/schema/task"
    xmlns:util="http://www.springframework.org/schema/util"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://www.springframework.org/schema/batch
        http://www.springframework.org/schema/batch/spring-batch-2.2.xsd
        http://www.springframework.org/schema/beans 
        http://www.springframework.org/schema/beans/spring-beans-3.2.xsd
        http://www.springframework.org/schema/util 
        http://www.springframework.org/schema/util/spring-util-3.2.xsd">


    <!-- My beans -->   
    <bean id="patent" class="com.example.model.Patent" scope="prototype" />
    <bean id="xmlsuffix" class="com.example.filename.PatentFileSuffixCreator"/>
    <bean id="noInputException"     class="com.example.listener.NoWorkFoundStepExecutionListener"/>

    <batch:job id="csvtoxml">
        <batch:step id="step1">
            <batch:tasklet>             
                <batch:chunk reader="fileReader"     writer="multiResourceItemWriter" commit-interval="1">
                </batch:chunk>
                <batch:listeners>
                    <batch:listener ref="noInputException"/>
                </batch:listeners>  
            </batch:tasklet>
        </batch:step>
    </batch:job>

    <bean id="multiResourceItemWriter"
    class="org.springframework.batch.item.file.MultiResourceItemWriter">
        <property name="resource" value="file:xml/#{patent.ID}" />
        <property name="delegate" ref="XMLwriter"/>
        <property name="itemCountLimitPerResource" value="1"/>
        <property name="resourceSuffixCreator" ref="xmlsuffix"/>
    </bean>

    <bean id="XMLwriter" 
                class="org.springframework.batch.item.xml.StaxEventItemWriter">
        <property name="marshaller" ref="patentUnmarshaller" />
        <property name="rootTagName" value="Patents" />
    </bean>

    <bean id="patentUnmarshaller" 
     class="org.springframework.oxm.xstream.XStreamMarshaller">
        <property name="aliases">
            <map>
                <entry key="Patent"
                value="com.example.model.Patent" />
            </map>
        </property>
    </bean>

  <bean id="fileReader"
        class="org.springframework.batch.item.file.FlatFileItemReader" scope="step">
        <property name="lineMapper" ref="lineMapper"/>
        <property name="resource" value="file:dbbrev_sample_m.csv"/>
        <property name="linesToSkip" value="1"/>
    </bean>

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

    <bean id="lineTokenizer"
        class="org.springframework.batch.item.file.transform.DelimitedLineTokenizer">
        <property name="delimiter" value=","/>
        <property name="names" value="ID,TYPE,NOPUBLICATION" />
    </bean>

    <bean id="fieldSetMapper"
        class="org.springframework.batch.item.file.mapping.BeanWrapperFieldSetMapper">
        <property name="targetType" value="com.example.model.Patent"/>
    </bean>
</beans>
Luca Basso Ricci

Create a ItemWriteListener, inject the multiResourceItemWriter bean and bound the listener to your step.
In ItemWriteListener.beforeWrite() create a new ResourceSuffixCreator object using the item your are going to write as base to create resource extension (suffix).
MultiResourceItemWriter.resource probably need to be changed as file:xml/ because 1.xml, 2.xml and so on will be appended using custom ResourceSuffixCreator dinamically created for every item you are writing.

This solution is dirty and (probably) works due to commit-interval=1; if you change my answer (probably) will fail.

I hope I was clear, English is not my native language.

Collected from the Internet

Please contact [email protected] to delete if infringement.

edited at
0

Comments

0 comments
Login to comment

Related

From Dev

spring batch ItemReader FlatFileItemReader set cursor to start reading from a particular line or set linestoskip dynamically

From Dev

Insert & Update from single Spring Batch ItemReader

From Dev

How to get the JobExecutionId in ItemReader in Spring Batch 4

From Dev

Spring Batch : custom ItemReader

From Dev

Spring Batch: How to access the current step's id / name from within an ItemReader or ItemWriter

From Dev

How to get currentResourceItemCount from MultiResourceItemWriter

From Dev

Reading from streams instead of files in spring batch itemReader

From Dev

Spring Batch: Create an ItemReader that reads an xml file from a web service

From Dev

How to use multiple transactioManager in each ItemReader and ItemWriter in spring batch

From Dev

How to pass List to Spring Batch ItemReader via REST call

From Dev

spring batch dynamic query to itemreader

From Dev

Spring Batch ItemReader + RabbitMQ - No 'queue' specified

From Dev

Spring-Batch: Testing custom itemReader

From Dev

Number of lines read with Spring Batch ItemReader

From Dev

Spring Batch: Executing job depending on result in itemReader

From Dev

Spring Batch ItemReader to process Tree structured File

From Dev

How does one open a Reader when implementing ItemReader in a Spring Batch project?

From Dev

How to dynamically schedule a Spring Batch job with ThreadPoolTaskScheduler

From Dev

Spring Batch: Which ItemReader implementation to use for high volume & low latency

From Dev

Can we write a Spring Batch Job Without ItemReader and ItemWriter

From Dev

spring batch itemreader read multiple lines and dynamic chunk size

From Dev

Spring Batch thread-safe ItemReader (process indicator pattern)

From Dev

When constructors for ItemReader, ItemProcessor, ItemWriter are called in Spring Batch?

From Dev

Spring Batch thread-safe ItemReader (process indicator pattern)

From Java

spring boot : How to set spring properties dynamically

From Dev

spring boot : How to set spring properties dynamically

From Dev

Setting a resource for Spring Batch reader from file system

From Dev

Spring Batch JpaPagingItemReader: how to set a query hint?

From Dev

How to set path resource from EditText?

Related Related

  1. 1

    spring batch ItemReader FlatFileItemReader set cursor to start reading from a particular line or set linestoskip dynamically

  2. 2

    Insert & Update from single Spring Batch ItemReader

  3. 3

    How to get the JobExecutionId in ItemReader in Spring Batch 4

  4. 4

    Spring Batch : custom ItemReader

  5. 5

    Spring Batch: How to access the current step's id / name from within an ItemReader or ItemWriter

  6. 6

    How to get currentResourceItemCount from MultiResourceItemWriter

  7. 7

    Reading from streams instead of files in spring batch itemReader

  8. 8

    Spring Batch: Create an ItemReader that reads an xml file from a web service

  9. 9

    How to use multiple transactioManager in each ItemReader and ItemWriter in spring batch

  10. 10

    How to pass List to Spring Batch ItemReader via REST call

  11. 11

    spring batch dynamic query to itemreader

  12. 12

    Spring Batch ItemReader + RabbitMQ - No 'queue' specified

  13. 13

    Spring-Batch: Testing custom itemReader

  14. 14

    Number of lines read with Spring Batch ItemReader

  15. 15

    Spring Batch: Executing job depending on result in itemReader

  16. 16

    Spring Batch ItemReader to process Tree structured File

  17. 17

    How does one open a Reader when implementing ItemReader in a Spring Batch project?

  18. 18

    How to dynamically schedule a Spring Batch job with ThreadPoolTaskScheduler

  19. 19

    Spring Batch: Which ItemReader implementation to use for high volume & low latency

  20. 20

    Can we write a Spring Batch Job Without ItemReader and ItemWriter

  21. 21

    spring batch itemreader read multiple lines and dynamic chunk size

  22. 22

    Spring Batch thread-safe ItemReader (process indicator pattern)

  23. 23

    When constructors for ItemReader, ItemProcessor, ItemWriter are called in Spring Batch?

  24. 24

    Spring Batch thread-safe ItemReader (process indicator pattern)

  25. 25

    spring boot : How to set spring properties dynamically

  26. 26

    spring boot : How to set spring properties dynamically

  27. 27

    Setting a resource for Spring Batch reader from file system

  28. 28

    Spring Batch JpaPagingItemReader: how to set a query hint?

  29. 29

    How to set path resource from EditText?

HotTag

Archive