diff --git a/docker-compose.yaml b/docker-compose.yaml
new file mode 100644
index 0000000..e7f9026
--- /dev/null
+++ b/docker-compose.yaml
@@ -0,0 +1,20 @@
+version: "2.2"
+services:
+ mongo:
+ image: mongo:5.0
+ container_name: mongo
+ restart: unless-stopped
+ ports:
+ - "27017:27017"
+
+ mongo-express:
+ image: mongo-express:latest
+ container_name: mongo-express
+ environment:
+ - ME_CONFIG_MONGODB_URL=mongodb://mongo:27017/?authSource=admin
+ - ME_CONFIG_BASICAUTH_USERNAME=admin
+ - ME_CONFIG_BASICAUTH_PASSWORD=pass
+ links:
+ - mongo
+ ports:
+ - "8081:8081"
diff --git a/pom.xml b/pom.xml
index 1d1ae9f..cd7beab 100644
--- a/pom.xml
+++ b/pom.xml
@@ -5,7 +5,7 @@
org.springframework.boot
spring-boot-starter-parent
- 2.4.4
+ 3.2.1
com.springbatch.excel
@@ -14,8 +14,8 @@
tutorial
Demo project for Spring Boot
- 1.8
- 4.1.2
+ 21
+ 5.2.4
@@ -43,6 +43,8 @@
org.projectlombok
lombok
+ 1.18.30
+ provided
true
@@ -51,29 +53,16 @@
test
- org.springframework.batch
- spring-batch-test
- test
+ com.h2database
+ h2
+
+
+ org.springframework.boot
+ spring-boot-starter-data-jpa
+
-
-
-
- org.springframework.boot
- spring-boot-maven-plugin
-
-
-
- org.projectlombok
- lombok
-
-
-
-
-
-
-
diff --git a/src/main/java/com/springbatch/excel/tutorial/TutorialApplication.java b/src/main/java/com/springbatch/excel/tutorial/TutorialApplication.java
index 60266aa..dd18e4d 100644
--- a/src/main/java/com/springbatch/excel/tutorial/TutorialApplication.java
+++ b/src/main/java/com/springbatch/excel/tutorial/TutorialApplication.java
@@ -2,11 +2,10 @@
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
-import org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration;
import org.springframework.scheduling.annotation.EnableScheduling;
@EnableScheduling
-@SpringBootApplication(exclude = {DataSourceAutoConfiguration.class})
+@SpringBootApplication
public class TutorialApplication {
public static void main(String[] args) {
diff --git a/src/main/java/com/springbatch/excel/tutorial/batch/BatchConfiguration.java b/src/main/java/com/springbatch/excel/tutorial/batch/BatchConfiguration.java
index 4932ad7..a009015 100644
--- a/src/main/java/com/springbatch/excel/tutorial/batch/BatchConfiguration.java
+++ b/src/main/java/com/springbatch/excel/tutorial/batch/BatchConfiguration.java
@@ -4,14 +4,15 @@
import com.springbatch.excel.tutorial.batch.processors.EmployeeItemProcessor;
import com.springbatch.excel.tutorial.batch.validators.EmployeeJobParametersValidator;
import com.springbatch.excel.tutorial.domain.Employee;
+import lombok.RequiredArgsConstructor;
import org.springframework.batch.core.Job;
import org.springframework.batch.core.JobParametersValidator;
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.job.CompositeJobParametersValidator;
+import org.springframework.batch.core.job.builder.JobBuilder;
import org.springframework.batch.core.launch.support.RunIdIncrementer;
+import org.springframework.batch.core.repository.JobRepository;
+import org.springframework.batch.core.step.builder.StepBuilder;
import org.springframework.batch.item.ItemProcessor;
import org.springframework.batch.item.ItemReader;
import org.springframework.batch.item.data.MongoItemWriter;
@@ -19,24 +20,21 @@
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.data.mongodb.core.MongoTemplate;
+import org.springframework.transaction.PlatformTransactionManager;
import java.util.Collections;
/**
* Configuration for batch
*/
-@EnableBatchProcessing
@Configuration
+@RequiredArgsConstructor
public class BatchConfiguration {
- public final JobBuilderFactory jobBuilderFactory;
+ public final JobRepository jobRepository;
+ public final MongoTemplate mongoTemplate;
+ public final PlatformTransactionManager transactionManager;
- public final StepBuilderFactory stepBuilderFactory;
-
- public BatchConfiguration(JobBuilderFactory jobBuilderFactory, StepBuilderFactory stepBuilderFactory) {
- this.jobBuilderFactory = jobBuilderFactory;
- this.stepBuilderFactory = stepBuilderFactory;
- }
@Bean
public JobParametersValidator jobParametersValidator() {
@@ -61,39 +59,41 @@ public ItemReader itemReader() {
}
@Bean
- public MongoItemWriter writer(MongoTemplate mongoTemplate) {
- return new MongoItemWriterBuilder().template(mongoTemplate).collection("employee")
+ public MongoItemWriter writerMongo() {
+ return new MongoItemWriterBuilder()
+ .template(mongoTemplate)
+ .collection("employee")
.build();
}
- /**
- * step declaration
- * @return {@link Step}
- */
@Bean
- public Step employeeStep(MongoItemWriter itemWriter) {
- return stepBuilderFactory.get("employeeStep")
- .chunk(50)
+ public Step employeeStep() {
+ return new StepBuilder("employeeStep", jobRepository)
+ .chunk(50, transactionManager)
.reader(itemReader())
.processor(itemProcessor())
- .writer(itemWriter)
+ .writer(writerMongo())
.build();
}
+ @Bean
+ public JobCompletionListener listener() {
+ return new JobCompletionListener();
+ }
/**
* job declaration
- * @param listener {@link JobCompletionListener}
+ *
* @return {@link Job}
*/
@Bean
- public Job employeeJob(JobCompletionListener listener, Step employeeStep) {
- return jobBuilderFactory.get("employeeJob")
+ public Job employeeJob() {
+ return new JobBuilder("employeeJob", jobRepository)
.incrementer(new RunIdIncrementer())
- .listener(listener)
- .flow(employeeStep)
+ .listener(listener())
+ .flow(employeeStep())
.end()
.validator(compositeJobParametersValidator())
.build();
diff --git a/src/main/java/com/springbatch/excel/tutorial/batch/EmployeeItemReader.java b/src/main/java/com/springbatch/excel/tutorial/batch/EmployeeItemReader.java
index 8e7715c..350bc4e 100644
--- a/src/main/java/com/springbatch/excel/tutorial/batch/EmployeeItemReader.java
+++ b/src/main/java/com/springbatch/excel/tutorial/batch/EmployeeItemReader.java
@@ -3,9 +3,8 @@
import com.springbatch.excel.tutorial.batch.mappers.EmployeeItemRowMapper;
import com.springbatch.excel.tutorial.domain.Employee;
import com.springbatch.excel.tutorial.support.poi.AbstractExcelPoi;
+import lombok.extern.slf4j.Slf4j;
import org.apache.poi.ss.formula.eval.NotImplementedException;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
import org.springframework.batch.core.ExitStatus;
import org.springframework.batch.core.StepExecution;
import org.springframework.batch.core.StepExecutionListener;
@@ -15,10 +14,9 @@
import java.util.List;
+@Slf4j
@Component
-public class EmployeeItemReader extends AbstractExcelPoi implements ItemReader , StepExecutionListener {
-
- private static final Logger LOGGER = LoggerFactory.getLogger(EmployeeItemReader.class);
+public class EmployeeItemReader extends AbstractExcelPoi implements ItemReader, StepExecutionListener {
private int employeeIndex = 0;
@@ -40,7 +38,7 @@ public Employee read() {
// read data in file
employeeList = read(path, new EmployeeItemRowMapper());
- if(!employeeList.isEmpty()) {
+ if (!employeeList.isEmpty()) {
if (employeeIndex < employeeList.size()) {
employee = employeeList.get(employeeIndex);
@@ -50,14 +48,14 @@ public Employee read() {
}
}
} catch (Exception e) {
- LOGGER.warn("Cannot read the excel file: {}", e.getMessage());
+ log.warn("Cannot read the excel file: {}", e.getMessage());
}
return employee;
}
@Override
- public void write(String filePath , List aList) {
+ public void write(String filePath, List aList) {
throw new NotImplementedException("No need to implement this method in the context");
}
diff --git a/src/main/java/com/springbatch/excel/tutorial/batch/EmployeeJobLauncher.java b/src/main/java/com/springbatch/excel/tutorial/batch/EmployeeJobLauncher.java
index 7b118c5..4dd19f6 100644
--- a/src/main/java/com/springbatch/excel/tutorial/batch/EmployeeJobLauncher.java
+++ b/src/main/java/com/springbatch/excel/tutorial/batch/EmployeeJobLauncher.java
@@ -1,7 +1,7 @@
package com.springbatch.excel.tutorial.batch;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
+import lombok.RequiredArgsConstructor;
+import lombok.extern.slf4j.Slf4j;
import org.springframework.batch.core.Job;
import org.springframework.batch.core.JobParameters;
import org.springframework.batch.core.JobParametersBuilder;
@@ -19,11 +19,11 @@
/**
* @author aek
*/
+@Slf4j
@Component
+@RequiredArgsConstructor
public class EmployeeJobLauncher {
- private static final Logger LOGGER = LoggerFactory.getLogger(EmployeeJobLauncher.class);
-
private final Job job;
private final JobLauncher jobLauncher;
@@ -31,26 +31,21 @@ public class EmployeeJobLauncher {
@Value("${employee.excel.processingfolder}")
private String processingDir;
- EmployeeJobLauncher(Job job, JobLauncher jobLauncher) {
- this.job = job;
- this.jobLauncher = jobLauncher;
- }
-
// run every 2 min
@Scheduled(fixedRate = 120000)
void launchFileToJob() throws JobParametersInvalidException, JobExecutionAlreadyRunningException, JobInstanceAlreadyCompleteException, JobRestartException {
- LOGGER.info("Starting job");
+ log.info("Starting job");
String excelFilePath = String.format("%s/employee.xlsx", processingDir);
JobParameters params = new JobParametersBuilder()
- .addLong("jobId",System.currentTimeMillis())
- .addDate("currentTime",new Date())
- .addString("excelPath",excelFilePath)
+ .addLong("jobId", System.currentTimeMillis())
+ .addDate("currentTime", new Date())
+ .addString("excelPath", excelFilePath)
.toJobParameters();
jobLauncher.run(job, params);
- LOGGER.info("Stopping job");
+ log.info("Stopping job");
}
}
diff --git a/src/main/java/com/springbatch/excel/tutorial/batch/listeners/JobCompletionListener.java b/src/main/java/com/springbatch/excel/tutorial/batch/listeners/JobCompletionListener.java
index 6e0b779..5499a86 100644
--- a/src/main/java/com/springbatch/excel/tutorial/batch/listeners/JobCompletionListener.java
+++ b/src/main/java/com/springbatch/excel/tutorial/batch/listeners/JobCompletionListener.java
@@ -1,40 +1,38 @@
package com.springbatch.excel.tutorial.batch.listeners;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
+import lombok.extern.slf4j.Slf4j;
import org.springframework.batch.core.BatchStatus;
import org.springframework.batch.core.JobExecution;
import org.springframework.batch.core.listener.JobExecutionListenerSupport;
import org.springframework.stereotype.Component;
-import java.util.Date;
+import java.time.LocalDateTime;
+@Slf4j
@Component
public class JobCompletionListener extends JobExecutionListenerSupport {
- private static final Logger LOGGER = LoggerFactory.getLogger(JobCompletionListener.class);
-
@Override
public void afterJob(JobExecution jobExecution) {
- String jobId = jobExecution.getJobParameters().getString("jobId");
+ String jobId = jobExecution.getJobParameters().getParameter("jobId").toString();
String excelFilePath = jobExecution.getJobParameters().getString("excelPath");
- // get job's start time
- Date start = jobExecution.getCreateTime();
+ // get job's start time
+ LocalDateTime start = jobExecution.getCreateTime();
// get job's end time
- Date end = jobExecution.getEndTime();
+ LocalDateTime end = jobExecution.getEndTime();
- if(jobExecution.getStatus() == BatchStatus.COMPLETED) {
+ if (jobExecution.getStatus() == BatchStatus.COMPLETED) {
- LOGGER.info("==========JOB FINISHED=======");
- LOGGER.info("JobId : {}",jobId);
- LOGGER.info("excel Path : {}",excelFilePath);
- LOGGER.info("Start Date: {}", start);
- LOGGER.info("End Date: {}", end);
- LOGGER.info("==============================");
+ log.info("==========JOB FINISHED=======");
+ log.info("JobId : {}", jobId);
+ log.info("excel Path : {}", excelFilePath);
+ log.info("Start Date: {}", start);
+ log.info("End Date: {}", end);
+ log.info("==============================");
}
}
-}
\ No newline at end of file
+}
diff --git a/src/main/java/com/springbatch/excel/tutorial/batch/mappers/EmployeeItemRowMapper.java b/src/main/java/com/springbatch/excel/tutorial/batch/mappers/EmployeeItemRowMapper.java
index 85419c3..382f7bc 100644
--- a/src/main/java/com/springbatch/excel/tutorial/batch/mappers/EmployeeItemRowMapper.java
+++ b/src/main/java/com/springbatch/excel/tutorial/batch/mappers/EmployeeItemRowMapper.java
@@ -10,15 +10,12 @@ public class EmployeeItemRowMapper extends CellFactory implements RowMapper implements ItemProcessor, StepExecutionListener {
-
- private static final Logger LOGGER = LoggerFactory.getLogger(EmployeeItemProcessor.class);
+@Slf4j
+public class EmployeeItemProcessor extends AbstractExcelPoi implements ItemProcessor, StepExecutionListener {
private static final List existingEmployees = new ArrayList<>();
@@ -46,9 +43,8 @@ public class EmployeeItemProcessor extends AbstractExcelPoi implement
@Override
public Employee process(Employee item) {
- if(repository.findByNumber(item.getNumber()).isPresent()){
+ if (repository.findByNumber(item.number()).isPresent()) {
existingEmployees.add(item);
-
return null;
}
@@ -60,25 +56,32 @@ public void beforeStep(StepExecution stepExecution) {
/* Nothing to do before */
}
- @SneakyThrows
+ // @SneakyThrows
@Override
public ExitStatus afterStep(StepExecution stepExecution) {
- String jobId = stepExecution.getJobParameters().getString("jobId");
+ String jobId = stepExecution.getJobParameters().getParameter("jobId").getValue().toString();
- if(stepExecution.getStatus() == BatchStatus.COMPLETED && !CollectionUtils.isEmpty(existingEmployees)) {
+ if (stepExecution.getStatus() == BatchStatus.COMPLETED && !CollectionUtils.isEmpty(existingEmployees)) {
// create log file. if completed
- String path = new ClassPathResource(resultsfolder).getFile().getPath();
- write(String.format("%s/employe-result-%s.xlsx", path, jobId),existingEmployees);
+ String path = null;
+ try {
+ path = new ClassPathResource(resultsfolder).getFile().getPath();
+ } catch (IOException e) {
+ throw new RuntimeException(e);
+ }
+ write(String.format("%s/employe-result-%s.xlsx", path, jobId), existingEmployees);
}
return null;
}
+
/**
* Create and write results file. employee duplicate entries
+ *
* @param filePath file path
* @param aList list of employee
*/
@Override
- public void write(String filePath , List aList) {
+ public void write(String filePath, List aList) {
try (XSSFWorkbook workbook = new XSSFWorkbook()) {
// Create a Sheet
Sheet sheet = workbook.createSheet("RESULTS");
@@ -96,28 +99,27 @@ public void write(String filePath , List aList) {
"Email",
"Number"
);
- createHeaderRow(sheet, headers,cellStyle);
+ createHeaderRow(sheet, headers, cellStyle);
// Create Other rows and cells with BeneficiaryExtraction data
int rowNum = 1;
- for(Employee employee: aList) {
+ for (Employee employee : aList) {
Row row = sheet.createRow(rowNum++);
- createCell(row, 0, employee.getFirstName(), null);
- createCell(row, 1, employee.getLastName(), null);
- createCell(row, 2, employee.getEmail(), null);
- createCell(row, 3, employee.getNumber(), null);
+ createCell(row, 0, employee.firstName(), null);
+ createCell(row, 1, employee.lastName(), null);
+ createCell(row, 2, employee.email(), null);
+ createCell(row, 3, employee.number(), null);
}
//lets write the excel data to file now
try (FileOutputStream outputStream = new FileOutputStream(filePath)) {
workbook.write(outputStream);
- LOGGER.info("Results File written successfully");
+ log.info("Results File written successfully");
}
- }
- catch (IOException e) {
- LOGGER.warn("Cannot write results file: {}", e.getMessage());
- }finally {
+ } catch (IOException e) {
+ log.warn("Cannot write results file: {}", e.getMessage());
+ } finally {
existingEmployees.clear();
}
}
diff --git a/src/main/java/com/springbatch/excel/tutorial/batch/validators/EmployeeJobParametersValidator.java b/src/main/java/com/springbatch/excel/tutorial/batch/validators/EmployeeJobParametersValidator.java
index dc10653..aa781c5 100644
--- a/src/main/java/com/springbatch/excel/tutorial/batch/validators/EmployeeJobParametersValidator.java
+++ b/src/main/java/com/springbatch/excel/tutorial/batch/validators/EmployeeJobParametersValidator.java
@@ -6,13 +6,13 @@
public class EmployeeJobParametersValidator implements org.springframework.batch.core.JobParametersValidator {
- @Override
- public void validate(final JobParameters jobParameters) throws JobParametersInvalidException {
- String fileName = jobParameters != null ? jobParameters.getString("excelPath") : null;
+ @Override
+ public void validate(final JobParameters jobParameters) throws JobParametersInvalidException {
+ String fileName = jobParameters != null ? jobParameters.getString("excelPath") : null;
- if (fileName !=null && !StringUtils.endsWithIgnoreCase(fileName, "xlsx")) {
- throw new JobParametersInvalidException("The file type must be in xlsx format");
- }
- }
+ if (fileName != null && !StringUtils.endsWithIgnoreCase(fileName, "xlsx")) {
+ throw new JobParametersInvalidException("The file type must be in xlsx format");
+ }
+ }
}
diff --git a/src/main/java/com/springbatch/excel/tutorial/domain/Employee.java b/src/main/java/com/springbatch/excel/tutorial/domain/Employee.java
index 15f5ae2..ec88f9d 100644
--- a/src/main/java/com/springbatch/excel/tutorial/domain/Employee.java
+++ b/src/main/java/com/springbatch/excel/tutorial/domain/Employee.java
@@ -1,37 +1,21 @@
package com.springbatch.excel.tutorial.domain;
-import com.sun.istack.internal.NotNull;
-import lombok.AllArgsConstructor;
-import lombok.Data;
-import lombok.NoArgsConstructor;
-import lombok.experimental.Accessors;
import org.springframework.data.annotation.Id;
import org.springframework.data.mongodb.core.index.IndexDirection;
import org.springframework.data.mongodb.core.index.Indexed;
import org.springframework.data.mongodb.core.mapping.Document;
-@Data
-@AllArgsConstructor
-@NoArgsConstructor
-@Accessors(chain = true)
@Document(collection = "employee")
-public class Employee {
-
- @Id
- private String id;
-
- private String firstName;
-
- private String lastName;
-
- @NotNull
- @Indexed(unique = true, direction = IndexDirection.DESCENDING)
- private String number;
-
- private String email;
-
- private String department;
-
- private double salary;
-}
\ No newline at end of file
+public record Employee(
+ @Id
+ String id,
+ String firstName,
+ String lastName,
+ @Indexed(unique = true, direction = IndexDirection.DESCENDING)
+ String number,
+ String email,
+ String department,
+ double salary
+) {
+}
diff --git a/src/main/java/com/springbatch/excel/tutorial/service/EmployeeService.java b/src/main/java/com/springbatch/excel/tutorial/service/EmployeeService.java
index a36f647..6c17797 100644
--- a/src/main/java/com/springbatch/excel/tutorial/service/EmployeeService.java
+++ b/src/main/java/com/springbatch/excel/tutorial/service/EmployeeService.java
@@ -1,7 +1,6 @@
package com.springbatch.excel.tutorial.service;
-
import com.springbatch.excel.tutorial.domain.Employee;
import java.util.Optional;
@@ -13,4 +12,4 @@ public interface EmployeeService {
* @return Optional employee
*/
Optional getByNumber(String number);
-}
\ No newline at end of file
+}
diff --git a/src/main/java/com/springbatch/excel/tutorial/support/poi/AbstractExcelPoi.java b/src/main/java/com/springbatch/excel/tutorial/support/poi/AbstractExcelPoi.java
index d871704..0489ab8 100644
--- a/src/main/java/com/springbatch/excel/tutorial/support/poi/AbstractExcelPoi.java
+++ b/src/main/java/com/springbatch/excel/tutorial/support/poi/AbstractExcelPoi.java
@@ -1,5 +1,6 @@
package com.springbatch.excel.tutorial.support.poi;
+import lombok.extern.slf4j.Slf4j;
import org.apache.poi.ss.usermodel.*;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;
@@ -9,26 +10,23 @@
import java.text.ParseException;
import java.util.ArrayList;
import java.util.List;
-import java.util.logging.Level;
-import java.util.logging.Logger;
/**
* @param generic Class
* @author aek
*/
+@Slf4j
public abstract class AbstractExcelPoi {
- private static final Logger LOGGER = Logger.getLogger(AbstractExcelPoi.class.getName());
-
/**
* @param filePath file path
- * @param aList list of object
+ * @param aList list of object
*/
public abstract void write(String filePath, List aList);
/**
* @param filePathStr file path location
- * @param rowMapper RowMapper object
+ * @param rowMapper RowMapper object
* @return list of
*/
public List read(String filePathStr, final RowMapper rowMapper) {
@@ -38,20 +36,20 @@ public List read(String filePathStr, final RowMapper rowMapper) {
Sheet sheet = workbook.getSheetAt(0);
- sheet.forEach(row -> {
- // skip header
- if (row.getRowNum() != 0){
- try {
- bookList.add(rowMapper.transformerRow(row));
- } catch (ParseException exception) {
- LOGGER.log(Level.WARNING, "RowMapper Parse exception");
- }
+ sheet.forEach(row -> {
+ // skip header
+ if (row.getRowNum() != 0) {
+ try {
+ bookList.add(rowMapper.transformerRow(row));
+ } catch (ParseException exception) {
+ log.warn("RowMapper Parse exception");
}
- });
+ }
+ });
return bookList;
} catch (IOException e) {
- throw new ExcelFileException(String.format("Cannot read the file: %s",e.getMessage()));
+ throw new ExcelFileException(String.format("Cannot read the file: %s", e.getMessage()));
}
}
@@ -62,7 +60,7 @@ public List read(String filePathStr, final RowMapper rowMapper) {
private Workbook getWorkbook(String filePathStr) {
Workbook workbook;
- try{
+ try {
try (FileInputStream inputStream = new FileInputStream(new File(filePathStr))) {
if (filePathStr.endsWith("xlsx")) {
workbook = new XSSFWorkbook(inputStream);
@@ -70,7 +68,7 @@ private Workbook getWorkbook(String filePathStr) {
throw new ExcelFileException("The specified file is not Excel file");
}
}
- }catch(SecurityException | IOException e){
+ } catch (SecurityException | IOException e) {
throw new ExcelFileException("The specified file is not Excel file");
}
@@ -78,17 +76,16 @@ private Workbook getWorkbook(String filePathStr) {
}
-
-
/**
* Create header of file
- * @param sheet excel sheet
- * @param headers list string of header
+ *
+ * @param sheet excel sheet
+ * @param headers list string of header
* @param rowStyle style of header row
*/
public void createHeaderRow(Sheet sheet, List headers, CellStyle rowStyle) {
- if(!headers.isEmpty()){
+ if (!headers.isEmpty()) {
// Create a Row
Row row = sheet.createRow(0);
// Create cells
@@ -101,10 +98,10 @@ public void createHeaderRow(Sheet sheet, List headers, CellStyle rowStyl
}
/**
- * @param row file row
+ * @param row file row
* @param columnCount index of column
- * @param value the value to will set
- * @param style cel row
+ * @param value the value to will set
+ * @param style cel row
* @return Cell value
*/
public Cell createCell(Row row, int columnCount, Object value, CellStyle style) {
@@ -113,14 +110,14 @@ public Cell createCell(Row row, int columnCount, Object value, CellStyle style)
cell.setCellValue((Integer) value);
} else if (value instanceof Boolean) {
cell.setCellValue((Boolean) value);
- }else if (value instanceof Double) {
+ } else if (value instanceof Double) {
cell.setCellValue((Double) value);
} else {
cell.setCellValue((String) value);
}
- if(style != null){
+ if (style != null) {
cell.setCellStyle(style);
}
diff --git a/src/main/java/com/springbatch/excel/tutorial/support/poi/CellFactory.java b/src/main/java/com/springbatch/excel/tutorial/support/poi/CellFactory.java
index 584f69a..dc1d271 100644
--- a/src/main/java/com/springbatch/excel/tutorial/support/poi/CellFactory.java
+++ b/src/main/java/com/springbatch/excel/tutorial/support/poi/CellFactory.java
@@ -9,11 +9,12 @@
/**
* Extract cell value
+ *
* @author aek
*/
public class CellFactory {
- private static final EnumMap>
+ private static final EnumMap>
EXCEL_CELL_VALUE = new EnumMap<>(CellType.class);
static {
@@ -37,13 +38,13 @@ public class CellFactory {
* @return Object row
*/
public Object getCellValue(Cell cell) {
- try{
- if(cell == null){
+ try {
+ if (cell == null) {
return null;
}
return EXCEL_CELL_VALUE.get(cell.getCellType()).apply(cell);
- }catch (Exception e){
- throw new UnknownCellTypeException(String.format("Unknown cell type ( %s )",cell.getCellType()));
+ } catch (Exception e) {
+ throw new UnknownCellTypeException(String.format("Unknown cell type ( %s )", cell.getCellType()));
}
}
diff --git a/src/main/java/com/springbatch/excel/tutorial/support/poi/package-info.java b/src/main/java/com/springbatch/excel/tutorial/support/poi/package-info.java
index 4e12456..1ac6d11 100644
--- a/src/main/java/com/springbatch/excel/tutorial/support/poi/package-info.java
+++ b/src/main/java/com/springbatch/excel/tutorial/support/poi/package-info.java
@@ -1,5 +1,6 @@
/**
* Core package for the Apache POI library.
+ *
* @author aek
*/
-package com.springbatch.excel.tutorial.support.poi;
\ No newline at end of file
+package com.springbatch.excel.tutorial.support.poi;
diff --git a/src/main/resources/application.yml b/src/main/resources/application.yml
index 7fe2c8b..a7b8a04 100644
--- a/src/main/resources/application.yml
+++ b/src/main/resources/application.yml
@@ -1,11 +1,23 @@
spring:
+ h2:
+ console:
+ enabled: true
+ datasource:
+ url: jdbc:h2:mem:batch-sample;MODE=Oracle;DB_CLOSE_ON_EXIT=FALSE;DB_CLOSE_DELAY=-1
+ driverClassName: org.h2.Driver
+ username: sa
+ password: qaz@123
+ jpa:
+ database-platform: org.hibernate.dialect.H2Dialect
+
data:
mongodb:
host: localhost
port: 27017
- database: <>
- username: <>
- password: <>
+ database: spring_batch_excel_mongodb_db
+# username: admin
+# password: pass
+ auto-index-creation: true
jackson:
default-property-inclusion: NON_NULL
@@ -13,6 +25,9 @@ spring:
batch:
job:
enabled: false
+ initialize-schema: never
+ initializer:
+ enabled: false
# Enable Logging mongo queries
logging:
@@ -23,3 +38,5 @@ employee:
excel:
processingfolder: data/processing/
resultsfolder: data/results/
+file:
+ input: countries.csv
diff --git a/src/test/java/com/springbatch/excel/tutorial/BachIntegrationTest.java b/src/test/java/com/springbatch/excel/tutorial/BachIntegrationTest.java
new file mode 100644
index 0000000..130a434
--- /dev/null
+++ b/src/test/java/com/springbatch/excel/tutorial/BachIntegrationTest.java
@@ -0,0 +1,61 @@
+package com.springbatch.excel.tutorial;
+import com.springbatch.excel.tutorial.batch.BatchConfiguration;
+import com.springbatch.excel.tutorial.batch.listeners.JobCompletionListener;
+import com.springbatch.excel.tutorial.domain.Employee;
+import org.junit.jupiter.api.Test;
+import org.junit.jupiter.api.extension.ExtendWith;
+import org.springframework.batch.core.Job;
+import org.springframework.batch.core.JobExecution;
+import org.springframework.batch.core.JobParameter;
+import org.springframework.batch.core.JobParameters;
+import org.springframework.batch.core.configuration.annotation.EnableBatchProcessing;
+import org.springframework.batch.core.launch.JobLauncher;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.boot.test.context.SpringBootTest;
+import org.springframework.context.annotation.ComponentScan;
+import org.springframework.data.mongodb.core.MongoTemplate;
+import org.springframework.test.context.junit.jupiter.SpringExtension;
+
+import java.util.*;
+
+import static org.assertj.core.api.AssertionsForClassTypes.assertThat;
+
+
+
+@ExtendWith(SpringExtension.class)
+@EnableBatchProcessing
+@ComponentScan(basePackages = "com.springbatch.excel.tutorial")
+@SpringBootTest(classes = {BatchConfiguration.class, JobCompletionListener.class})
+class BatchIntegrationTest {
+
+ @Autowired
+ private JobLauncher jobLauncher;
+
+ @Autowired
+ private Job jsonFileProcessingJob;
+
+ @Autowired
+ private MongoTemplate mongoTemplate;
+
+ @Test
+ void testBatchJob() throws Exception {
+ String absolutePath = Objects.requireNonNull(getClass().getResource("/data/processing/employee.xlsx")).getPath();
+
+ // Créez les paramètres du job
+ Map jobParameters = new HashMap<>();
+ jobParameters.put("filePath", new JobParameter(absolutePath));
+ jobParameters.put("currentTime", new JobParameter(new Date()));
+
+ // Lancez le job avec les paramètres
+ JobExecution jobExecution = jobLauncher.run(jsonFileProcessingJob,new JobParameters(jobParameters));
+
+ // Vérifiez que le job s'est terminé avec succès
+ assertThat(jobExecution.getExitStatus().getExitCode()).isEqualTo("COMPLETED");
+
+ List couponOffers = mongoTemplate.findAll(Employee.class);
+ assertThat(couponOffers.size()).isEqualTo(100);
+
+ }
+}
+
+
diff --git a/src/test/resources/application.yml b/src/test/resources/application.yml
new file mode 100644
index 0000000..a0fd8c1
--- /dev/null
+++ b/src/test/resources/application.yml
@@ -0,0 +1,26 @@
+spring:
+ data:
+ mongodb:
+ host: localhost
+ port: 27017
+ database: spring_batch_excel_mongodb_db
+# username: admin
+# password: pass
+ auto-index-creation: true
+
+ jackson:
+ default-property-inclusion: NON_NULL
+#disabled job run at startup
+ batch:
+ job:
+ enabled: false
+
+# Enable Logging mongo queries
+logging:
+ level:
+ org.springframework.data.mongodb.core.MongoTemplate: DEBUG
+
+employee:
+ excel:
+ processingfolder: data/processing/
+ resultsfolder: data/results/
diff --git a/src/test/resources/data/processing/employee.txt b/src/test/resources/data/processing/employee.txt
new file mode 100644
index 0000000..e69de29
diff --git a/src/test/resources/data/processing/employee.xlsx b/src/test/resources/data/processing/employee.xlsx
new file mode 100644
index 0000000..312ae9a
Binary files /dev/null and b/src/test/resources/data/processing/employee.xlsx differ
diff --git a/src/test/resources/data/results/readme.txt b/src/test/resources/data/results/readme.txt
new file mode 100644
index 0000000..e69de29