Skip to content

Commit 9f8b095

Browse files
authored
Add files via upload
1 parent ca32e44 commit 9f8b095

File tree

10 files changed

+1307
-0
lines changed

10 files changed

+1307
-0
lines changed

pom.xml

Lines changed: 72 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,72 @@
1+
<?xml version="1.0" encoding="UTF-8"?>
2+
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
3+
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
4+
<modelVersion>4.0.0</modelVersion>
5+
<parent>
6+
<groupId>org.springframework.boot</groupId>
7+
<artifactId>spring-boot-starter-parent</artifactId>
8+
<version>2.6.7</version>
9+
<relativePath/> <!-- lookup parent from repository -->
10+
</parent>
11+
<groupId>com.javatechie</groupId>
12+
<artifactId>batch-processing-demo</artifactId>
13+
<version>0.0.1-SNAPSHOT</version>
14+
<name>batch-processing-demo</name>
15+
<description>Demo project for Spring Boot</description>
16+
<properties>
17+
<java.version>1.8</java.version>
18+
</properties>
19+
<dependencies>
20+
<dependency>
21+
<groupId>org.springframework.boot</groupId>
22+
<artifactId>spring-boot-starter-batch</artifactId>
23+
</dependency>
24+
<dependency>
25+
<groupId>org.springframework.boot</groupId>
26+
<artifactId>spring-boot-starter-data-jpa</artifactId>
27+
</dependency>
28+
<dependency>
29+
<groupId>org.springframework.boot</groupId>
30+
<artifactId>spring-boot-starter-web</artifactId>
31+
</dependency>
32+
33+
<dependency>
34+
<groupId>mysql</groupId>
35+
<artifactId>mysql-connector-java</artifactId>
36+
<scope>runtime</scope>
37+
</dependency>
38+
<dependency>
39+
<groupId>org.projectlombok</groupId>
40+
<artifactId>lombok</artifactId>
41+
<optional>true</optional>
42+
</dependency>
43+
<dependency>
44+
<groupId>org.springframework.boot</groupId>
45+
<artifactId>spring-boot-starter-test</artifactId>
46+
<scope>test</scope>
47+
</dependency>
48+
<dependency>
49+
<groupId>org.springframework.batch</groupId>
50+
<artifactId>spring-batch-test</artifactId>
51+
<scope>test</scope>
52+
</dependency>
53+
</dependencies>
54+
55+
<build>
56+
<plugins>
57+
<plugin>
58+
<groupId>org.springframework.boot</groupId>
59+
<artifactId>spring-boot-maven-plugin</artifactId>
60+
<configuration>
61+
<excludes>
62+
<exclude>
63+
<groupId>org.projectlombok</groupId>
64+
<artifactId>lombok</artifactId>
65+
</exclude>
66+
</excludes>
67+
</configuration>
68+
</plugin>
69+
</plugins>
70+
</build>
71+
72+
</project>
Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
package com.javatechie.spring.batch;
2+
3+
import org.springframework.batch.core.configuration.annotation.EnableBatchProcessing;
4+
import org.springframework.boot.SpringApplication;
5+
import org.springframework.boot.autoconfigure.SpringBootApplication;
6+
7+
@SpringBootApplication
8+
public class BatchProcessingDemoApplication {
9+
10+
public static void main(String[] args) {
11+
SpringApplication.run(BatchProcessingDemoApplication.class, args);
12+
}
13+
14+
}
Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
package com.javatechie.spring.batch.config;
2+
3+
import com.javatechie.spring.batch.entity.Customer;
4+
import org.springframework.batch.item.ItemProcessor;
5+
6+
public class CustomerProcessor implements ItemProcessor<Customer,Customer> {
7+
8+
@Override
9+
public Customer process(Customer customer) throws Exception {
10+
if(customer.getCountry().equals("United States")) {
11+
return customer;
12+
}else{
13+
return null;
14+
}
15+
}
16+
}
Lines changed: 99 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,99 @@
1+
package com.javatechie.spring.batch.config;
2+
3+
import com.javatechie.spring.batch.entity.Customer;
4+
import com.javatechie.spring.batch.repository.CustomerRepository;
5+
import lombok.AllArgsConstructor;
6+
import org.springframework.batch.core.Job;
7+
import org.springframework.batch.core.Step;
8+
import org.springframework.batch.core.configuration.annotation.EnableBatchProcessing;
9+
import org.springframework.batch.core.configuration.annotation.JobBuilderFactory;
10+
import org.springframework.batch.core.configuration.annotation.StepBuilderFactory;
11+
import org.springframework.batch.item.data.RepositoryItemWriter;
12+
import org.springframework.batch.item.file.FlatFileItemReader;
13+
import org.springframework.batch.item.file.LineMapper;
14+
import org.springframework.batch.item.file.mapping.BeanWrapperFieldSetMapper;
15+
import org.springframework.batch.item.file.mapping.DefaultLineMapper;
16+
import org.springframework.batch.item.file.transform.DelimitedLineTokenizer;
17+
import org.springframework.context.annotation.Bean;
18+
import org.springframework.context.annotation.Configuration;
19+
import org.springframework.core.io.FileSystemResource;
20+
import org.springframework.core.task.SimpleAsyncTaskExecutor;
21+
import org.springframework.core.task.TaskExecutor;
22+
23+
@Configuration
24+
@EnableBatchProcessing
25+
@AllArgsConstructor
26+
public class SpringBatchConfig {
27+
28+
private JobBuilderFactory jobBuilderFactory;
29+
30+
private StepBuilderFactory stepBuilderFactory;
31+
32+
private CustomerRepository customerRepository;
33+
34+
35+
@Bean
36+
public FlatFileItemReader<Customer> reader() {
37+
FlatFileItemReader<Customer> itemReader = new FlatFileItemReader<>();
38+
itemReader.setResource(new FileSystemResource("src/main/resources/customers.csv"));
39+
itemReader.setName("csvReader");
40+
itemReader.setLinesToSkip(1);
41+
itemReader.setLineMapper(lineMapper());
42+
return itemReader;
43+
}
44+
45+
private LineMapper<Customer> lineMapper() {
46+
DefaultLineMapper<Customer> lineMapper = new DefaultLineMapper<>();
47+
48+
DelimitedLineTokenizer lineTokenizer = new DelimitedLineTokenizer();
49+
lineTokenizer.setDelimiter(",");
50+
lineTokenizer.setStrict(false);
51+
lineTokenizer.setNames("id", "firstName", "lastName", "email", "gender", "contactNo", "country", "dob");
52+
53+
BeanWrapperFieldSetMapper<Customer> fieldSetMapper = new BeanWrapperFieldSetMapper<>();
54+
fieldSetMapper.setTargetType(Customer.class);
55+
56+
lineMapper.setLineTokenizer(lineTokenizer);
57+
lineMapper.setFieldSetMapper(fieldSetMapper);
58+
return lineMapper;
59+
60+
}
61+
62+
@Bean
63+
public CustomerProcessor processor() {
64+
return new CustomerProcessor();
65+
}
66+
67+
@Bean
68+
public RepositoryItemWriter<Customer> writer() {
69+
RepositoryItemWriter<Customer> writer = new RepositoryItemWriter<>();
70+
writer.setRepository(customerRepository);
71+
writer.setMethodName("save");
72+
return writer;
73+
}
74+
75+
@Bean
76+
public Step step1() {
77+
return stepBuilderFactory.get("csv-step").<Customer, Customer>chunk(10)
78+
.reader(reader())
79+
.processor(processor())
80+
.writer(writer())
81+
.taskExecutor(taskExecutor())
82+
.build();
83+
}
84+
85+
@Bean
86+
public Job runJob() {
87+
return jobBuilderFactory.get("importCustomers")
88+
.flow(step1()).end().build();
89+
90+
}
91+
92+
@Bean
93+
public TaskExecutor taskExecutor() {
94+
SimpleAsyncTaskExecutor asyncTaskExecutor = new SimpleAsyncTaskExecutor();
95+
asyncTaskExecutor.setConcurrencyLimit(10);
96+
return asyncTaskExecutor;
97+
}
98+
99+
}
Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,35 @@
1+
package com.javatechie.spring.batch.controller;
2+
3+
import org.springframework.batch.core.Job;
4+
import org.springframework.batch.core.JobParameters;
5+
import org.springframework.batch.core.JobParametersBuilder;
6+
import org.springframework.batch.core.JobParametersInvalidException;
7+
import org.springframework.batch.core.launch.JobLauncher;
8+
import org.springframework.batch.core.repository.JobExecutionAlreadyRunningException;
9+
import org.springframework.batch.core.repository.JobInstanceAlreadyCompleteException;
10+
import org.springframework.batch.core.repository.JobRestartException;
11+
import org.springframework.beans.factory.annotation.Autowired;
12+
import org.springframework.web.bind.annotation.PostMapping;
13+
import org.springframework.web.bind.annotation.RequestMapping;
14+
import org.springframework.web.bind.annotation.RestController;
15+
16+
@RestController
17+
@RequestMapping("/jobs")
18+
public class JobController {
19+
20+
@Autowired
21+
private JobLauncher jobLauncher;
22+
@Autowired
23+
private Job job;
24+
25+
@PostMapping("/importCustomers")
26+
public void importCsvToDBJob() {
27+
JobParameters jobParameters = new JobParametersBuilder()
28+
.addLong("startAt", System.currentTimeMillis()).toJobParameters();
29+
try {
30+
jobLauncher.run(job, jobParameters);
31+
} catch (JobExecutionAlreadyRunningException | JobRestartException | JobInstanceAlreadyCompleteException | JobParametersInvalidException e) {
32+
e.printStackTrace();
33+
}
34+
}
35+
}
Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,38 @@
1+
package com.javatechie.spring.batch.entity;
2+
3+
import lombok.AllArgsConstructor;
4+
import lombok.Data;
5+
import lombok.NoArgsConstructor;
6+
7+
import javax.persistence.Column;
8+
import javax.persistence.Entity;
9+
import javax.persistence.Id;
10+
import javax.persistence.Table;
11+
12+
@Entity
13+
@Table(name = "CUSTOMERS_INFO")
14+
@Data
15+
@AllArgsConstructor
16+
@NoArgsConstructor
17+
public class Customer {
18+
19+
@Id
20+
@Column(name = "CUSTOMER_ID")
21+
private int id;
22+
@Column(name = "FIRST_NAME")
23+
private String firstName;
24+
@Column(name = "LAST_NAME")
25+
private String lastName;
26+
@Column(name = "EMAIL")
27+
private String email;
28+
@Column(name = "GENDER")
29+
private String gender;
30+
@Column(name = "CONTACT")
31+
private String contactNo;
32+
@Column(name = "COUNTRY")
33+
private String country;
34+
@Column(name = "DOB")
35+
private String dob;
36+
37+
38+
}
Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
package com.javatechie.spring.batch.repository;
2+
3+
import com.javatechie.spring.batch.entity.Customer;
4+
import org.springframework.data.jpa.repository.JpaRepository;
5+
6+
public interface CustomerRepository extends JpaRepository<Customer,Integer> {
7+
}
Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
2+
spring.datasource.url = jdbc:mysql://localhost:3306/javatechie
3+
spring.datasource.username = root
4+
spring.datasource.password = Password
5+
spring.jpa.show-sql = true
6+
spring.jpa.hibernate.ddl-auto = update
7+
spring.jpa.properties.hibernate.dialect = org.hibernate.dialect.MySQL5Dialect
8+
server.port=9191
9+
spring.batch.initialize-schema=ALWAYS
10+
11+
#disabled job run at startup
12+
spring.batch.job.enabled=false

0 commit comments

Comments
 (0)