package
com.batch.app;
import
java.util.Properties;
import
javax.persistence.EntityManagerFactory;
import
javax.sql.DataSource;
import
org.springframework.batch.core.Job;
import
org.springframework.batch.core.Step;
import
org.springframework.batch.core.configuration.annotation.EnableBatchProcessing;
import
org.springframework.batch.core.configuration.annotation.JobBuilderFactory;
import
org.springframework.batch.core.configuration.annotation.StepBuilderFactory;
import
org.springframework.batch.core.launch.support.RunIdIncrementer;
import
org.springframework.batch.item.ItemProcessor;
import
org.springframework.batch.item.ItemReader;
import
org.springframework.batch.item.ItemWriter;
import
org.springframework.batch.item.database.JpaPagingItemReader;
import
org.springframework.beans.factory.annotation.Autowired;
import
org.springframework.context.annotation.Bean;
import
org.springframework.context.annotation.Configuration;
import
org.springframework.jdbc.datasource.DriverManagerDataSource;
import
org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean;
import
org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter;
@Configuration
@EnableBatchProcessing
public
class
BatchConfiguration {
@Autowired
private
JobBuilderFactory jobBuilderFactory;
@Autowired
private
StepBuilderFactory stepBuilderFactory;
@Bean
public
ItemReader<Book>
reader(EntityManagerFactory entityManagerFactory)
{
JpaPagingItemReader<Book> reader
=
new
JpaPagingItemReader<>();
reader.setEntityManagerFactory(
entityManagerFactory);
reader.setQueryString(
"SELECT b FROM Book b"
);
reader.setPageSize(
10
);
return
reader;
}
@Bean
public
ItemProcessor<Book, Book> processor()
{
return
new
BookEntityItemProcessor();
}
@Bean
public
ItemWriter<Book> writer()
{
return
new
BookEntityCsvWriter();
}
@Bean
public
Job exportJob(Step exportStep)
{
return
jobBuilderFactory.get(
"exportJob"
)
.incrementer(
new
RunIdIncrementer())
.flow(exportStep)
.end()
.build();
}
@Bean
public
Step
exportStep(ItemReader<Book> reader,
ItemProcessor<Book, Book> processor,
ItemWriter<Book> writer)
{
return
stepBuilderFactory.get(
"exportStep"
)
.<Book, Book>chunk(
10
)
.reader(reader)
.processor(processor)
.writer(writer)
.build();
}
@Bean
public
EntityManagerFactory entityManagerFactory()
{
LocalContainerEntityManagerFactoryBean emf
=
new
LocalContainerEntityManagerFactoryBean();
emf.setDataSource(dataSource());
emf.setPackagesToScan(
"com.batch.app"
);
emf.setJpaVendorAdapter(
new
HibernateJpaVendorAdapter());
emf.setJpaProperties(jpaProperties());
emf.afterPropertiesSet();
return
emf.getObject();
}
@Bean
public
DataSource dataSource()
{
DriverManagerDataSource dataSource
=
new
DriverManagerDataSource();
dataSource.setDriverClassName(
"com.mysql.cj.jdbc.Driver"
);
dataSource.setUrl(
dataSource.setUsername(
"root"
);
dataSource.setPassword(
"password"
);
return
dataSource;
}
@Bean
public
Properties jpaProperties()
{
Properties properties =
new
Properties();
properties.setProperty(
"hibernate.dialect"
,
"org.hibernate.dialect.MySQLDialect"
);
return
properties;
}
}