In this post, we will show you how to configure a Spring Batch job to read data from a CSV file and write into mongo database.
Project structure
This is a directory structure of the standard gradle project.
Project dependencies
task wrapper(type: Wrapper) { gradleVersion = '3.2.1' } apply plugin: 'java' apply plugin: 'eclipse' apply plugin: 'org.springframework.boot' sourceCompatibility = 1.8 repositories { mavenLocal() mavenCentral() } dependencies { compile 'org.springframework.data:spring-data-mongodb:1.9.8.RELEASE' compileOnly('org.projectlombok:lombok:1.16.12') compile('org.springframework.boot:spring-boot-starter-batch:1.5.2.RELEASE') testCompile('org.springframework.boot:spring-boot-starter-test:1.5.2.RELEASE') } buildscript { repositories { mavenLocal() jcenter() } dependencies { classpath "org.springframework.boot:spring-boot-gradle-plugin:1.5.2.RELEASE" } }
application.properties file
spring.data.mongodb.host=127.0.0.1 spring.data.mongodb.port=27017 spring.data.mongodb.database=springbatch
Spring Batch Jobs
CSV file
1,walkingtechie.blogspot.com 2,google.com 3,facebook.com 4,twitter.com
Create a job which will read CSV file and write into mongo database.
package com.walking.techie.csvtomongo.jobs; import com.walking.techie.csvtomongo.model.Domain; 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.data.MongoItemWriter; import org.springframework.batch.item.file.FlatFileItemReader; import org.springframework.batch.item.file.mapping.BeanWrapperFieldSetMapper; import org.springframework.batch.item.file.mapping.DefaultLineMapper; import org.springframework.batch.item.file.transform.DelimitedLineTokenizer; 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; import org.springframework.data.mongodb.core.MongoTemplate; @EnableBatchProcessing @Configuration public class CsvToMongoJob { @Autowired private JobBuilderFactory jobBuilderFactory; @Autowired private StepBuilderFactory stepBuilderFactory; @Autowired private MongoTemplate mongoTemplate; @Bean public Job readCSVFile() { return jobBuilderFactory.get("readCSVFile").incrementer(new RunIdIncrementer()).start(step1()) .build(); } @Bean public Step step1() { return stepBuilderFactory.get("step1").<Domain, Domain>chunk(10).reader(reader()) .writer(writer()).build(); } @Bean public FlatFileItemReader<Domain> reader() { FlatFileItemReader<Domain> reader = new FlatFileItemReader<>(); reader.setResource(new ClassPathResource("sample-data.csv")); reader.setLineMapper(new DefaultLineMapper<Domain>() {{ setLineTokenizer(new DelimitedLineTokenizer() {{ setNames(new String[]{"id", "name"}); }}); setFieldSetMapper(new BeanWrapperFieldSetMapper<Domain>() {{ setTargetType(Domain.class); }}); }}); return reader; } @Bean public MongoItemWriter<Domain> writer() { MongoItemWriter<Domain> writer = new MongoItemWriter<Domain>(); writer.setTemplate(mongoTemplate); writer.setCollection("domain"); return writer; } }
Map CSV file values to Domain
object and write to mongodb.
A Java model class
package com.walking.techie.csvtomongo.model; import lombok.Data; @Data public class Domain { private int id; private String name; }
Run Application
package com.walking.techie; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration; @SpringBootApplication(exclude = DataSourceAutoConfiguration.class) public class Application { public static void main(String[] args) { SpringApplication.run(Application.class, args); } }
Output
This application will read data from sample-data.csv file and write records in domain collection. you can verify the records in mongodb.
output in console
2017-03-29 19:47:26.320 INFO 43082 --- [ main] o.s.b.c.l.support.SimpleJobLauncher : Job: [SimpleJob: [name=readCSVFile]] launched with the following parameters: [{run.id=1}] 2017-03-29 19:47:26.338 INFO 43082 --- [ main] o.s.batch.core.job.SimpleStepHandler : Executing step: [step1] 2017-03-29 19:47:26.401 INFO 43082 --- [ main] org.mongodb.driver.connection : Opened connection [connectionId{localValue:2, serverValue:414}] to 127.0.0.1:27017 2017-03-29 19:47:26.429 INFO 43082 --- [ main] o.s.b.c.l.support.SimpleJobLauncher : Job: [SimpleJob: [name=readCSVFile]] completed with the following parameters: [{run.id=1}] and the following status: [COMPLETED]
Note : This code has been compiled and run on mac notebook and intellij IDEA.
hi
ReplyDeleteI am stuck with
Description
Cannot determine embedded database driver class for database type NONE
Action
If you want an embedded database please put a supported one on the classpath. If you have database settings to be loaded from a particular profile you may need to active it (no profiles are currently active).
Please guide me.
I forgot to exclude databaseAutoConfiguration. Now i got another problem which is
ReplyDeleteError creating bean with name 'batchConfig': Unsatisfied dependency expressed through field 'mongoTemplate'; nested exception is org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'mongoTemplate' defined in class path resource [org/springframework/boot/autoconfigure/data/mongo/MongoDataAutoConfiguration.class]: Unsatisfied dependency expressed through method 'mongoTemplate' parameter 0; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'mongoDbFactory' defined in class path resource [org/springframework/boot/autoconfigure/data/mongo/MongoDataAutoConfiguration.class]: Bean instantiation via factory method failed; nested exception is org.springframework.beans.BeanInstantiationException: Failed to instantiate [org.springframework.data.mongodb.core.SimpleMongoDbFactory]: Factory method 'mongoDbFactory' threw exception; nested exception is java.lang.NoSuchMethodError: org.springframework.data.mongodb.core.SimpleMongoDbFactory.(Lcom/mongodb/MongoClient;Ljava/lang/String;)V
Hi, Can please tell the process of spring batch to import excel file to mysql with integer and date fields
ReplyDeleteHi, Can please tell the process of spring batch to import excel file to mysql with integer and date fields
ReplyDelete