<div dir="ltr" style="text-align: justify;">
<div dir="ltr" style="text-align: justify;">
<h2><b>Class MultiResourceItemReader</b></h2>
<p>Reads items from multiple resources sequentially &#8211; resource list is given by <i><b>setResources(Resource[])</b></i>, the actual reading is delegated to <b><i>setDelegate(ResourceAwareItemReaderItemStream)</i></b>. Input resources are ordered using <i><b>setComparator(Comparator)</b></i> to make sure resource ordering is preserved between job runs in restart scenario.</p>
<p><i><b>MultiResourceItemReader </b></i>class reads items from multiple resources sequentially.</p>
<p><b>Suppose one of the question in mind of user-</b><br />
<b> </b><br />
I have a Spring batch operation where I have sources file1, file2 and file3 to read from, and want to write to fileA, fileB and fileC like the following:</p>
<p><i><b>file1->;fileA<br />
file2->;fileB<br />
file3->;fileC</b></i></p>
<p>In some scenario use want to put these three resources into a single file. In this example, we will show you how to read items from multiple resources (multiple xml files), and write the items into a single xml file.</p>
<p><i><b>emp-111.xml + emp-222.xml + emp-333.xml = employees.xml</b></i></p>
<div id="ads-id" align="center"></div>
<h3><b>Tools and libraries used</b></h3>
<ul style="text-align: left;">
<li>Spring Tool Suite (STS)</li>
<li>JDK 1.6</li>
<li>Spring Core 3.2.2.RELEASE</li>
<li>Spring OXM 3.2.2.RELEASE</li>
<li>Spring Batch 2.2.0.RELEASE</li>
</ul>
<h3><b>1. Project Directory Structure</b></h3>
<div class="separator" style="clear: both; text-align: center;"><img src="https://dineshonjava.com/wp-content/uploads/2014/03/111-2.png" border="0" /></div>
<h3><b>2. Input XML Files</b></h3>
<p>There are 3 xml files, later we will use <i><b>MultiResourceItemReader </b></i>to read it one by one.</p>
<p><b>emp-111.xml</b></p>
<pre class="highlight"><;?xml version="1.0" encoding="UTF-8"?>; 
<;employees>; 
 <;employee>; 
 <;address>;Mumbai<;/address>; 
 <;age>;17<;/age>; 
 <;empid>;111<;/empid>; 
 <;name>;ATUL KUMAR<;/name>; 
 <;salary>;700000.0<;/salary>; 
 <;/employee>; 
<;/employees>; 
</pre>
<p><i><b>emp-222.xml</b></i></p>
<pre class="highlight"><;?xml version="1.0" encoding="UTF-8"?>; 
<;employees>; 
 <;employee>; 
 <;address>;Noida<;/address>; 
 <;age>;21<;/age>; 
 <;empid>;222<;/empid>; 
 <;name>;ASHUTOSH RAJPUT<;/name>; 
 <;salary>;400000.0<;/salary>; 
 <;/employee>; 
<;/employees>; 
</pre>
<p><i><b>emp-333.xml</b></i></p>
<pre class="highlight"><;?xml version="1.0" encoding="UTF-8"?>; 
<;employees>; 
 <;employee>; 
 <;address>;Delhi<;/address>; 
 <;age>;17<;/age>; 
 <;empid>;333<;/empid>; 
 <;name>;Dinesh Rajput<;/name>; 
 <;salary>;300000.0<;/salary>; 
 <;/employee>; 
<;/employees>; 
</pre>
<h3><b>3. ItemReader for XML File</b></h3>
<p>In this example, we use Jaxb2Marshaller to map XML values and attributes to an object.</p>
<pre class="highlight"><;bean class="org.springframework.batch.item.xml.StaxEventItemReader" id="xmlItemReader">; 
 <;property name="unmarshaller" ref="empUnMarshaller">; 
 <;property name="fragmentRootElementName" value="employee">; 
 <;/property>;<;/property>;<;/bean>; 
</pre>
<p><b>Employee.java</b></p>
<pre class="highlight">package com.doj.batch.bean; 
 
import javax.xml.bind.annotation.XmlAccessOrder; 
import javax.xml.bind.annotation.XmlAccessorOrder; 
import javax.xml.bind.annotation.XmlRootElement; 
 
/** 
 * @author Dinesh Rajput 
 * 
 */ 
@XmlRootElement(name="employee") 
@XmlAccessorOrder(XmlAccessOrder.UNDEFINED) 
public class Employee { 
 private int empid; 
 private String name; 
 private int age; 
 private float salary; 
 private String address; 
 /** 
 * @return the empid 
 */ 
 public int getEmpid() { 
 return empid; 
 } 
 /** 
 * @param empid the empid to set 
 */ 
 public void setEmpid(int empid) { 
 this.empid = empid; 
 } 
 /** 
 * @return the name 
 */ 
 public String getName() { 
 return name; 
 } 
 /** 
 * @param name the name to set 
 */ 
 public void setName(String name) { 
 this.name = name; 
 } 
 /** 
 * @return the age 
 */ 
 public int getAge() { 
 return age; 
 } 
 /** 
 * @param age the age to set 
 */ 
 public void setAge(int age) { 
 this.age = age; 
 } 
 /** 
 * @return the salary 
 */ 
 public float getSalary() { 
 return salary; 
 } 
 /** 
 * @param salary the salary to set 
 */ 
 public void setSalary(float salary) { 
 this.salary = salary; 
 } 
 /** 
 * @return the address 
 */ 
 public String getAddress() { 
 return address; 
 } 
 /** 
 * @param address the address to set 
 */ 
 public void setAddress(String address) { 
 this.address = address; 
 } 
 
} 
</pre>
<h3><b>4. Spring Batch Core configuration</b></h3>
<p>Define <i><b>jobRepository </b></i>and <i><b>jobLauncher</b></i>.<br />
<i><b>applicationContext.xml</b></i></p>
<pre class="highlight"><;?xml version="1.0" encoding="UTF-8"?>; 
<;beans xmlns="http://www.springframework.org/schema/beans" 
 xmlns:context="http://www.springframework.org/schema/context" 
 xmlns:p="http://www.springframework.org/schema/p" 
 xmlns:mvc="http://www.springframework.org/schema/mvc" 
 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
 xsi:schemaLocation="http://www.springframework.org/schema/beans 
http://www.springframework.org/schema/beans/spring-beans-4.0.xsd 
http://www.springframework.org/schema/context 
http://www.springframework.org/schema/context/spring-context-4.0.xsd 
http://www.springframework.org/schema/mvc 
http://www.springframework.org/schema/mvc/spring-mvc-4.0.xsd">; 
 
 <;bean id="transactionManager" class="org.springframework.batch.support.transaction.ResourcelessTransactionManager"/>; 
 
 <;bean id="jobLauncher" class="org.springframework.batch.core.launch.support.SimpleJobLauncher">; 
 <;property name="jobRepository" ref="jobRepository"/>; 
 <;/bean>; 
 
 <;bean id="jobRepository" class="org.springframework.batch.core.repository.support.MapJobRepositoryFactoryBean">; 
 <;property name="transactionManager" ref="transactionManager"/>; 
 <;/bean>; 
 
 <;bean id="simpleJob" class="org.springframework.batch.core.job.SimpleJob" abstract="true">; 
 <;property name="jobRepository" ref="jobRepository" />; 
 <;/bean>; 
 
<;/beans>; 
</pre>
<h3><b>5. Spring Batch Jobs Configuration</b></h3>
<p><i><b>simple-job.xml</b></i><br />
A job to read resources that matches this pattern <i><b>xml/inputs/emp-*.xml,</b></i> and write it into a single xml file <b>employees.xml.</b></p>
<pre class="highlight"><;?xml version="1.0" encoding="UTF-8"?>; 
<;beans xmlns="http://www.springframework.org/schema/beans" 
 xmlns:context="http://www.springframework.org/schema/context" 
 xmlns:p="http://www.springframework.org/schema/p" 
 xmlns:batch="http://www.springframework.org/schema/batch" 
 xmlns:mvc="http://www.springframework.org/schema/mvc" 
 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
 xsi:schemaLocation="http://www.springframework.org/schema/beans 
http://www.springframework.org/schema/beans/spring-beans-4.0.xsd 
http://www.springframework.org/schema/context 
http://www.springframework.org/schema/context/spring-context-4.0.xsd 
http://www.springframework.org/schema/mvc 
http://www.springframework.org/schema/mvc/spring-mvc-4.0.xsd 
http://www.springframework.org/schema/batch 
http://www.springframework.org/schema/batch/spring-batch-2.0.xsd">; 
 
 <;import resource="applicationContext.xml"/>; 
 
 <;bean id="xmlItemReader" class="org.springframework.batch.item.xml.StaxEventItemReader">; 
 <;property name="unmarshaller" ref="empUnMarshaller" />; 
 <;property name="fragmentRootElementName" value="employee" />; 
 <;/bean>; 
 
 <;bean id="empUnMarshaller" class="org.springframework.oxm.jaxb.Jaxb2Marshaller">; 
 <;property name="classesToBeBound">; 
 <;value>;com.doj.batch.bean.Employee<;/value>; 
 <;/property>; 
 <;/bean>; 
 
 <;bean id="multiResourceReader" class=" org.springframework.batch.item.file.MultiResourceItemReader">; 
 <;property name="resources" value="file:xml/inputs/emp-*.xml" />; 
 <;property name="delegate" ref="xmlItemReader" />; 
 <;/bean>; 
 
 <;bean id="xmlItemWriter" class="org.springframework.batch.item.xml.StaxEventItemWriter">; 
 <;property name="resource" value="file:xml/outputs/employees.xml" />; 
 <;property name="marshaller" ref="empMarshaller" />; 
 <;property name="rootTagName" value="employees" />; 
 <;/bean>; 
 
 <;bean id="empMarshaller" class="org.springframework.oxm.jaxb.Jaxb2Marshaller">; 
 <;property name="classesToBeBound">; 
 <;value>;com.doj.batch.bean.Employee<;/value>; 
 <;/property>; 
 <;/bean>; 
 
 <;batch:job id="simpleDojJob" parent="simpleJob">; 
 <;batch:step id="step1">; 
 <;batch:tasklet>; 
 <;batch:chunk reader="multiResourceReader" writer="xmlItemWriter" commit-interval="1"/>; 
 <;/batch:tasklet>; 
 <;/batch:step>; 
 <;/batch:job>; 
<;/beans>; 
</pre>
<h3><b>6. Launching Batch Job-</b></h3>
<p>Spring Batch comes with a simple utility class called CommandLineJobRunner which has a main() method which accepts two arguments. First argument is the spring application context file containing job definition and the second is the name of the job to be executed.</p>
<p>Now run as a java application with both two arguments.<br />
<i><b>org.springframework.batch.core.launch.support.CommandLineJobRunner</b></i><br />
<i><b>simple-job.xml simpleDojJob</b></i></p>
<p><b>Output. The Spring Batch are created the content of employees.xml.</b></p>
<pre class="highlight"><;?xml version="1.0" encoding="UTF-8"?>; 
<;employees>; 
 <;employee>; 
 <;address>;Mumbai<;/address>; 
 <;age>;17<;/age>; 
 <;empid>;111<;/empid>; 
 <;name>;ATUL KUMAR<;/name>; 
 <;salary>;700000.0<;/salary>; 
 <;/employee>; 
 <;employee>; 
 <;address>;Noida<;/address>; 
 <;age>;21<;/age>; 
 <;empid>;222<;/empid>; 
 <;name>;ASHUTOSH RAJPUT<;/name>; 
 <;salary>;400000.0<;/salary>; 
 <;/employee>; 
 <;employee>; 
 <;address>;Delhi<;/address>; 
 <;age>;17<;/age>; 
 <;empid>;333<;/empid>; 
 <;name>;Dinesh Rajput<;/name>; 
 <;salary>;300000.0<;/salary>; 
 <;/employee>; 
<;/employees>; 
</pre>
</div>
<h3><b>Download Source Code with Jars</b><br />
<b><a href="https://sites.google.com/a/dineshonjava.com/dineshonjava/dineshonjava/SpringBatchMultiResource.zip?attredirects=0&;d=1" target="_blank" rel="noopener">SpringBatchMultiResource.zip</a></b></h3>
<p> ;</p>
<div style="text-align: center;"><b><;<;<a href="https://dineshonjava.com/spring-batch-xml-to-mongodb-database/">Previuos</a><;<; <a href="https://dineshonjava.com/spring-tutorial/">Index </a>>;>; <a href="https://dineshonjava.com/spring-batch-taskscheduler-example/">Next</a>>;>;</b></div>
<p> ;</p>
</div>
<div class="wp-post-navigation"> 
									 <div class="wp-post-navigation-pre"> 
									 <a href="https://dineshonjava.com/spring-batch-xml-to-mongodb-database/">Previous</a> 
									 </div> 
									 <div class="wp-post-navigation-next"> 
									 <a href="https://dineshonjava.com/spring-batch-taskscheduler-example/">Next</a> 
									 </div> 
									</div>
<script type="text/javascript">
jQuery(document).ready(function($) {
 $.post('https://dineshonjava.com/wp-admin/admin-ajax.php', {action: 'mts_view_count', id: '221'});
});
</script>
Strategy Design Patterns We can easily create a strategy design pattern using lambda. To implement…
Decorator Pattern A decorator pattern allows a user to add new functionality to an existing…
Delegating pattern In software engineering, the delegation pattern is an object-oriented design pattern that allows…
Technology has emerged a lot in the last decade, and now we have artificial intelligence;…
Managing a database is becoming increasingly complex now due to the vast amount of data…
Overview In this article, we will explore Spring Scheduler how we could use it by…