Overview
This tutorial will demostarte how to use Spring Batch listeners.
Technologies Usded
- spring-boot-starter-batch
- Maven 3
- JDK 1.8
- IDEA
Project Structure
1.Listener Example
CustomStepListener.java
import org.springframework.batch.core.ExitStatus;
import org.springframework.batch.core.StepExecution;
import org.springframework.batch.core.StepExecutionListener;
public class CustomStepListener implements StepExecutionListener {
public void beforeStep(StepExecution stepExecution) {
System.out.println("StepExecutionListener - beforeStep");
}
public ExitStatus afterStep(StepExecution stepExecution) {
System.out.println("StepExecutionListener - afterStep");
return null;
}
}
CustomItemReaderListener.java
import org.springframework.batch.core.ItemReadListener;
import com.mkyong.Domain;
public class CustomItemReaderListener implements ItemReadListener<Domain> {
public void beforeRead() {
System.out.println("ItemReadListener - beforeRead");
}
public void afterRead(Domain item) {
System.out.println("ItemReadListener - afterRead");
}
public void onReadError(Exception ex) {
System.out.println("ItemReadListener - onReadError");
}
}
CustomItemWriterListener.java
import java.util.List;
import org.springframework.batch.core.ItemWriteListener;
import com.mkyong.Domain;
public class CustomItemWriterListener implements ItemWriteListener<Domain> {
public void beforeWrite(List<? extends Domain> items) {
System.out.println("ItemWriteListener - beforeWrite");
}
public void afterWrite(List<? extends Domain> items) {
System.out.println("ItemWriteListener - afterWrite");
}
public void onWriteError(Exception exception, List<? extends Domain> items) {
System.out.println("ItemWriteListener - onWriteError");
}
}
spring-batch-job.xml
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:batch="http://www.springframework.org/schema/batch" 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
">
<import resource="../config/context.xml" />
<bean id="domain" class="com.andrew.programming.Domain" />
<bean id="fileDeletingTasklet" class="com.andrew.programming.tasklet.FileDeletingTasklet" >
<property name="directory" value="file:csv/inputs/" />
</bean>
<bean id="customStepListener" class="com.andrew.programming.listeners.CustomStepListener" />
<bean id="customItemReaderListener" class="com.andrew.programming.listeners.CustomItemReaderListener" />
<bean id="customItemWriterListener" class="com.andrew.programming.listeners.CustomItemWriterListener" />
<job id="readMultiFileJob" xmlns="http://www.springframework.org/schema/batch">
<step id="step1">
<tasklet>
<chunk reader="multiResourceReader" writer="flatFileItemWriter"
commit-interval="1" />
<listeners>
<listener ref="customStepListener" />
<listener ref="customItemReaderListener" />
<listener ref="customItemWriterListener" />
</listeners>
</tasklet>
</step>
<!--
<step id="deleteDir">
<tasklet ref="fileDeletingTasklet" />
</step>
-->
</job>
<bean id="multiResourceReader"
class=" org.springframework.batch.item.file.MultiResourceItemReader">
<property name="resources" value="file:csv/inputs/domain-*.csv" />
<property name="delegate" ref="flatFileItemReader" />
</bean>
<bean id="flatFileItemReader" 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="names" value="id, domain" />
</bean>
</property>
<property name="fieldSetMapper">
<bean
class="org.springframework.batch.item.file.mapping.BeanWrapperFieldSetMapper">
<property name="prototypeBeanName" value="domain" />
</bean>
</property>
</bean>
</property>
</bean>
<bean id="flatFileItemWriter" class="org.springframework.batch.item.file.FlatFileItemWriter">
<property name="resource" value="file:csv/outputs/domain.all.csv" />
<property name="appendAllowed" value="true" />
<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, domain" />
</bean>
</property>
</bean>
</property>
</bean>
</beans>
Run it
StepExecutionListener - beforeStep
ItemReadListener - beforeRead
ItemReadListener - afterRead
ItemWriteListener - beforeWrite
ItemWriteListener - afterWrite
ItemReadListener - beforeRead
ItemReadListener - afterRead
ItemWriteListener - beforeWrite
ItemWriteListener - afterWrite
ItemReadListener - beforeRead
ItemReadListener - afterRead
ItemWriteListener - beforeWrite
ItemWriteListener - afterWrite
StepExecutionListener - afterStep
Source code
springbatchtutorial_listenerExample-master