Update Spring batch test function and project

This commit is contained in:
YuCheng Hu
2019-10-11 14:17:51 -04:00
parent 35d19a3cd3
commit 78fde71a5c
39 changed files with 86 additions and 127 deletions
-72
View File
@@ -1,72 +0,0 @@
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.baeldung</groupId>
<artifactId>spring-batch</artifactId>
<version>0.1-SNAPSHOT</version>
<name>spring-batch</name>
<packaging>jar</packaging>
<url>http://maven.apache.org</url>
<parent>
<groupId>com.baeldung</groupId>
<artifactId>parent-modules</artifactId>
<version>1.0.0-SNAPSHOT</version>
</parent>
<dependencies>
<!-- SQLite database driver -->
<dependency>
<groupId>org.xerial</groupId>
<artifactId>sqlite-jdbc</artifactId>
<version>${sqlite.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-oxm</artifactId>
<version>${spring.version}</version>
<exclusions>
<exclusion>
<artifactId>commons-logging</artifactId>
<groupId>commons-logging</groupId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-jdbc</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.springframework.batch</groupId>
<artifactId>spring-batch-core</artifactId>
<version>${spring.batch.version}</version>
</dependency>
<dependency>
<groupId>org.springframework.batch</groupId>
<artifactId>spring-batch-test</artifactId>
<version>${spring.batch.version}</version>
</dependency>
<dependency>
<groupId>com.opencsv</groupId>
<artifactId>opencsv</artifactId>
<version>${opencsv.version}</version>
</dependency>
<dependency>
<groupId>org.awaitility</groupId>
<artifactId>awaitility</artifactId>
<version>${awaitility.version}</version>
<scope>test</scope>
</dependency>
</dependencies>
<properties>
<spring.version>5.0.3.RELEASE</spring.version>
<spring.batch.version>4.0.0.RELEASE</spring.batch.version>
<sqlite.version>3.15.1</sqlite.version>
<opencsv.version>4.1</opencsv.version>
<awaitility.version>3.1.1</awaitility.version>
</properties>
</project>
Binary file not shown.
@@ -1,4 +1,4 @@
package org.baeldung.batch;
package com.ossez.spring.batch;
import org.springframework.batch.core.Job;
import org.springframework.batch.core.JobExecution;
@@ -42,4 +42,4 @@ public class App {
System.out.println("Job failed");
}
}
}
}
@@ -0,0 +1,12 @@
package com.ossez.spring.batch;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
@SpringBootApplication
public class Application {
public static void main(String[] args) throws Exception {
SpringApplication.run(Application.class, args);
}
}
@@ -1,4 +1,4 @@
package org.baeldung.batch;
package com.ossez.spring.batch;
import org.baeldung.batch.model.Transaction;
import org.baeldung.batch.service.CustomItemProcessor;
@@ -1,4 +1,4 @@
package org.baeldung.batch;
package com.ossez.spring.batch;
import java.net.MalformedURLException;
@@ -75,4 +75,4 @@ public class SpringConfig {
return jobLauncher;
}
}
}
@@ -14,7 +14,7 @@
* limitations under the License.
*/
package org.baeldung.batch.partitioner;
package com.ossez.spring.batch.partitioner;
import java.util.HashMap;
import java.util.Map;
@@ -1,4 +1,4 @@
package org.baeldung.batch.partitioner;
package com.ossez.spring.batch.partitioner;
import org.baeldung.batch.model.Transaction;
import org.baeldung.batch.service.RecordFieldSetMapper;
@@ -1,4 +1,4 @@
package org.baeldung.batch.partitioner;
package com.ossez.spring.batch.partitioner;
import org.springframework.batch.core.Job;
import org.springframework.batch.core.JobExecution;
@@ -25,4 +25,4 @@ public class SpringbatchPartitionerApp {
System.out.println("Job failed");
}
}
}
}
@@ -1,4 +1,4 @@
package org.baeldung.batch.service;
package com.ossez.spring.batch.service;
import org.baeldung.batch.model.Transaction;
import org.springframework.batch.item.ItemProcessor;
@@ -9,4 +9,4 @@ public class CustomItemProcessor implements ItemProcessor<Transaction, Transacti
System.out.println("Processing..." + item);
return item;
}
}
}
@@ -1,4 +1,4 @@
package org.baeldung.batch.service;
package com.ossez.spring.batch.service;
import org.springframework.batch.core.step.skip.SkipLimitExceededException;
import org.springframework.batch.core.step.skip.SkipPolicy;
@@ -1,4 +1,4 @@
package org.baeldung.batch.service;
package com.ossez.spring.batch.service;
public class MissingUsernameException extends RuntimeException {
}
@@ -1,4 +1,4 @@
package org.baeldung.batch.service;
package com.ossez.spring.batch.service;
public class NegativeAmountException extends RuntimeException {
@@ -1,4 +1,4 @@
package org.baeldung.batch.service;
package com.ossez.spring.batch.service;
import java.text.ParseException;
import java.text.SimpleDateFormat;
@@ -1,4 +1,4 @@
package org.baeldung.batch.service;
package com.ossez.spring.batch.service;
import org.baeldung.batch.model.Transaction;
import org.springframework.batch.item.ItemProcessor;
@@ -1,4 +1,4 @@
package org.baeldung.batchscheduler;
package com.ossez.spring.batchscheduler;
import java.util.Date;
import java.util.IdentityHashMap;
@@ -0,0 +1,82 @@
package us.cwiki.spring.batch.processing;
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.database.BeanPropertyItemSqlParameterSourceProvider;
import org.springframework.batch.item.database.JdbcBatchItemWriter;
import org.springframework.batch.item.database.builder.JdbcBatchItemWriterBuilder;
import org.springframework.batch.item.file.FlatFileItemReader;
import org.springframework.batch.item.file.builder.FlatFileItemReaderBuilder;
import org.springframework.batch.item.file.mapping.BeanWrapperFieldSetMapper;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.core.io.ClassPathResource;
@Configuration
@EnableBatchProcessing
public class BatchConfiguration {
@Autowired
public JobBuilderFactory jobBuilderFactory;
@Autowired
public StepBuilderFactory stepBuilderFactory;
// tag::readerwriterprocessor[]
@Bean
public FlatFileItemReader<Person> reader() {
return new FlatFileItemReaderBuilder<Person>()
.name("personItemReader")
.resource(new ClassPathResource("sample-data.csv"))
.delimited()
.names(new String[]{"firstName", "lastName"})
.fieldSetMapper(new BeanWrapperFieldSetMapper<Person>() {{
setTargetType(Person.class);
}})
.build();
}
@Bean
public PersonItemProcessor processor() {
return new PersonItemProcessor();
}
@Bean
public JdbcBatchItemWriter<Person> writer(DataSource dataSource) {
return new JdbcBatchItemWriterBuilder<Person>()
.itemSqlParameterSourceProvider(new BeanPropertyItemSqlParameterSourceProvider<>())
.sql("INSERT INTO people (first_name, last_name) VALUES (:firstName, :lastName)")
.dataSource(dataSource)
.build();
}
// end::readerwriterprocessor[]
// tag::jobstep[]
@Bean
public Job importUserJob(JobCompletionNotificationListener listener, Step step1) {
return jobBuilderFactory.get("importUserJob")
.incrementer(new RunIdIncrementer())
.listener(listener)
.flow(step1)
.end()
.build();
}
@Bean
public Step step1(JdbcBatchItemWriter<Person> writer) {
return stepBuilderFactory.get("step1")
.<Person, Person> chunk(10)
.reader(reader())
.processor(processor())
.writer(writer)
.build();
}
// end::jobstep[]
}
@@ -0,0 +1,36 @@
package us.cwiki.spring.batch.processing;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.batch.core.BatchStatus;
import org.springframework.batch.core.JobExecution;
import org.springframework.batch.core.listener.JobExecutionListenerSupport;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.stereotype.Component;
@Component
public class JobCompletionNotificationListener extends JobExecutionListenerSupport {
private static final Logger log = LoggerFactory.getLogger(JobCompletionNotificationListener.class);
private final JdbcTemplate jdbcTemplate;
@Autowired
public JobCompletionNotificationListener(JdbcTemplate jdbcTemplate) {
this.jdbcTemplate = jdbcTemplate;
}
@Override
public void afterJob(JobExecution jobExecution) {
if(jobExecution.getStatus() == BatchStatus.COMPLETED) {
log.info("!!! JOB FINISHED! Time to verify the results");
jdbcTemplate.query("SELECT first_name, last_name FROM people",
(rs, row) -> new Person(
rs.getString(1),
rs.getString(2))
).forEach(person -> log.info("Found <" + person + "> in the database."));
}
}
}
@@ -0,0 +1,37 @@
package us.cwiki.spring.batch.processing;
public class Person {
private String lastName;
private String firstName;
public Person() {
}
public Person(String firstName, String lastName) {
this.firstName = firstName;
this.lastName = lastName;
}
public void setFirstName(String firstName) {
this.firstName = firstName;
}
public String getFirstName() {
return firstName;
}
public String getLastName() {
return lastName;
}
public void setLastName(String lastName) {
this.lastName = lastName;
}
@Override
public String toString() {
return "firstName: " + firstName + ", lastName: " + lastName;
}
}
@@ -0,0 +1,24 @@
package us.cwiki.spring.batch.processing;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.batch.item.ItemProcessor;
public class PersonItemProcessor implements ItemProcessor<Person, Person> {
private static final Logger log = LoggerFactory.getLogger(PersonItemProcessor.class);
@Override
public Person process(final Person person) throws Exception {
final String firstName = person.getFirstName().toUpperCase();
final String lastName = person.getLastName().toUpperCase();
final Person transformedPerson = new Person(firstName, lastName);
log.info("Converting (" + person + ") into (" + transformedPerson + ")");
return transformedPerson;
}
}
@@ -1,6 +1,6 @@
package org.baeldung.taskletsvschunks.chunks;
package com.ossez.spring.taskletsvschunks.chunks;
import org.baeldung.taskletsvschunks.model.Line;
import com.ossez.spring.taskletsvschunks.model.Line;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.batch.core.ExitStatus;
@@ -1,7 +1,7 @@
package org.baeldung.taskletsvschunks.chunks;
package com.ossez.spring.taskletsvschunks.chunks;
import org.baeldung.taskletsvschunks.model.Line;
import org.baeldung.taskletsvschunks.utils.FileUtils;
import com.ossez.spring.taskletsvschunks.model.Line;
import com.ossez.spring.taskletsvschunks.utils.FileUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.batch.core.ExitStatus;
@@ -1,7 +1,8 @@
package org.baeldung.taskletsvschunks.chunks;
package com.ossez.spring.taskletsvschunks.chunks;
import org.baeldung.taskletsvschunks.model.Line;
import org.baeldung.taskletsvschunks.utils.FileUtils;
import com.ossez.spring.taskletsvschunks.model.Line;
import com.ossez.spring.taskletsvschunks.utils.FileUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.batch.core.ExitStatus;
@@ -1,9 +1,10 @@
package org.baeldung.taskletsvschunks.config;
package com.ossez.spring.taskletsvschunks.config;
import com.ossez.spring.taskletsvschunks.chunks.LineProcessor;
import com.ossez.spring.taskletsvschunks.chunks.LineReader;
import com.ossez.spring.taskletsvschunks.chunks.LinesWriter;
import com.ossez.spring.taskletsvschunks.model.Line;
import org.baeldung.taskletsvschunks.chunks.LineProcessor;
import org.baeldung.taskletsvschunks.chunks.LineReader;
import org.baeldung.taskletsvschunks.chunks.LinesWriter;
import org.baeldung.taskletsvschunks.model.Line;
import org.springframework.batch.core.Job;
import org.springframework.batch.core.Step;
import org.springframework.batch.core.configuration.annotation.EnableBatchProcessing;
@@ -1,8 +1,9 @@
package org.baeldung.taskletsvschunks.config;
package com.ossez.spring.taskletsvschunks.config;
import org.baeldung.taskletsvschunks.tasklets.LinesProcessor;
import org.baeldung.taskletsvschunks.tasklets.LinesReader;
import org.baeldung.taskletsvschunks.tasklets.LinesWriter;
import com.ossez.spring.taskletsvschunks.tasklets.LinesWriter;
import com.ossez.spring.taskletsvschunks.tasklets.LinesProcessor;
import com.ossez.spring.taskletsvschunks.tasklets.LinesReader;
import org.springframework.batch.core.Job;
import org.springframework.batch.core.Step;
import org.springframework.batch.core.configuration.annotation.EnableBatchProcessing;
@@ -1,4 +1,4 @@
package org.baeldung.taskletsvschunks.model;
package com.ossez.spring.taskletsvschunks.model;
import java.io.Serializable;
import java.time.LocalDate;
@@ -1,6 +1,6 @@
package org.baeldung.taskletsvschunks.tasklets;
package com.ossez.spring.taskletsvschunks.tasklets;
import org.baeldung.taskletsvschunks.model.Line;
import com.ossez.spring.taskletsvschunks.model.Line;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.batch.core.ExitStatus;
@@ -1,7 +1,7 @@
package org.baeldung.taskletsvschunks.tasklets;
package com.ossez.spring.taskletsvschunks.tasklets;
import org.baeldung.taskletsvschunks.model.Line;
import org.baeldung.taskletsvschunks.utils.FileUtils;
import com.ossez.spring.taskletsvschunks.model.Line;
import com.ossez.spring.taskletsvschunks.utils.FileUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.batch.core.ExitStatus;
@@ -1,7 +1,8 @@
package org.baeldung.taskletsvschunks.tasklets;
package com.ossez.spring.taskletsvschunks.tasklets;
import org.baeldung.taskletsvschunks.model.Line;
import org.baeldung.taskletsvschunks.utils.FileUtils;
import com.ossez.spring.taskletsvschunks.model.Line;
import com.ossez.spring.taskletsvschunks.utils.FileUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.batch.core.ExitStatus;
@@ -1,8 +1,8 @@
package org.baeldung.taskletsvschunks.utils;
package com.ossez.spring.taskletsvschunks.utils;
import com.opencsv.CSVReader;
import com.opencsv.CSVWriter;
import org.baeldung.taskletsvschunks.model.Line;
import com.ossez.spring.taskletsvschunks.model.Line;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
@@ -1,12 +1,12 @@
package org.baeldung;
import org.baeldung.batch.App;
import com.ossez.spring.batch.App;
import org.junit.Test;
public class SpringContextIntegrationTest {
@Test
@Test
public final void testMain() throws Exception {
App.main(null);
}
}
}
@@ -1,6 +1,8 @@
package org.baeldung;
import org.baeldung.batch.App;
import com.ossez.spring.batch.App;
import org.junit.Test;
public class SpringContextTest {
@@ -1,5 +1,6 @@
package org.baeldung.batchscheduler;
import com.ossez.spring.batchscheduler.SpringBatchScheduler;
import org.junit.Assert;
import org.junit.Test;
import org.junit.runner.RunWith;
@@ -1,6 +1,6 @@
package org.baeldung.taskletsvschunks.chunks;
import org.baeldung.taskletsvschunks.config.ChunksConfig;
import com.ossez.spring.taskletsvschunks.config.ChunksConfig;
import org.junit.Assert;
import org.junit.Test;
import org.junit.runner.RunWith;
@@ -22,4 +22,4 @@ public class ChunksIntegrationTest {
JobExecution jobExecution = jobLauncherTestUtils.launchJob();
Assert.assertEquals(ExitStatus.COMPLETED, jobExecution.getExitStatus());
}
}
}
@@ -1,6 +1,6 @@
package org.baeldung.taskletsvschunks.tasklets;
import org.baeldung.taskletsvschunks.config.TaskletsConfig;
import com.ossez.spring.taskletsvschunks.config.TaskletsConfig;
import org.junit.Assert;
import org.junit.Test;
import org.junit.runner.RunWith;
@@ -22,4 +22,4 @@ public class TaskletsIntegrationTest {
JobExecution jobExecution = jobLauncherTestUtils.launchJob();
Assert.assertEquals(ExitStatus.COMPLETED, jobExecution.getExitStatus());
}
}
}
-1
View File
@@ -1 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?><transactionRecord><transactionRecord><amount>10000.0</amount><transactionDate>2015-10-31T00:00:00+05:30</transactionDate><userId>1234</userId><username>devendra</username></transactionRecord><transactionRecord><amount>12321.0</amount><transactionDate>2015-12-03T00:00:00+05:30</transactionDate><userId>2134</userId><username>john</username></transactionRecord><transactionRecord><amount>23411.0</amount><transactionDate>2015-02-02T00:00:00+05:30</transactionDate><userId>2134</userId><username>robin</username></transactionRecord></transactionRecord>