From 5ee34b4055a514cc09167afa104b6f4a899b1f4b Mon Sep 17 00:00:00 2001 From: Mahmoud Ben Hassine Date: Wed, 19 Feb 2020 12:29:56 +0100 Subject: [PATCH] Add sample app for https://github.com/spring-projects/spring-batch/issues/1064 --- gh1064/pom.xml | 41 +++++++++++++ .../demo/FixedLengthBufferedReader.java | 40 +++++++++++++ .../src/main/java/com/example/demo/MyJob.java | 59 +++++++++++++++++++ gh1064/src/main/resources/data.txt | 1 + 4 files changed, 141 insertions(+) create mode 100644 gh1064/pom.xml create mode 100644 gh1064/src/main/java/com/example/demo/FixedLengthBufferedReader.java create mode 100644 gh1064/src/main/java/com/example/demo/MyJob.java create mode 100644 gh1064/src/main/resources/data.txt diff --git a/gh1064/pom.xml b/gh1064/pom.xml new file mode 100644 index 0000000..240a6f9 --- /dev/null +++ b/gh1064/pom.xml @@ -0,0 +1,41 @@ + + + 4.0.0 + + com.example + demo + 0.0.1-SNAPSHOT + demo + + + UTF-8 + 1.8 + 4.2.1.RELEASE + 3.8.1 + + + + + org.springframework.batch + spring-batch-core + ${spring-batch-core.version} + + + + + + + org.apache.maven.plugins + maven-compiler-plugin + ${maven-compiler-plugin.version} + + ${java.version} + ${java.version} + + + + + + diff --git a/gh1064/src/main/java/com/example/demo/FixedLengthBufferedReader.java b/gh1064/src/main/java/com/example/demo/FixedLengthBufferedReader.java new file mode 100644 index 0000000..b244539 --- /dev/null +++ b/gh1064/src/main/java/com/example/demo/FixedLengthBufferedReader.java @@ -0,0 +1,40 @@ +package com.example.demo; + +import java.io.BufferedReader; +import java.io.IOException; +import java.io.Reader; + +public class FixedLengthBufferedReader extends BufferedReader { + + public static final int DEFAULT_LINE_LENGTH = 32; + private int length; + + public FixedLengthBufferedReader(Reader in) { + this(in, DEFAULT_LINE_LENGTH); + } + + public FixedLengthBufferedReader(Reader in, int length) { + super(in); + this.length = length; + } + + // FIXME quick and dirty: add sanity checks, etc + @Override + public String readLine() throws IOException { + int next = read(); + if (next == -1) { + return null; + } + StringBuilder buffer = new StringBuilder(); + buffer.append((char)next); + for (int i = 1; i < length; i++) { + next = read(); + if (next != -1) { + buffer.append((char)next); + } else { + break; + } + } + return buffer.toString(); + } +} diff --git a/gh1064/src/main/java/com/example/demo/MyJob.java b/gh1064/src/main/java/com/example/demo/MyJob.java new file mode 100644 index 0000000..a4a834d --- /dev/null +++ b/gh1064/src/main/java/com/example/demo/MyJob.java @@ -0,0 +1,59 @@ +package com.example.demo; + +import java.io.InputStreamReader; + +import org.springframework.batch.core.Job; +import org.springframework.batch.core.JobParameters; +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.JobLauncher; +import org.springframework.batch.item.ItemWriter; +import org.springframework.batch.item.file.FlatFileItemReader; +import org.springframework.batch.item.file.builder.FlatFileItemReaderBuilder; +import org.springframework.batch.item.file.mapping.PassThroughLineMapper; +import org.springframework.context.ApplicationContext; +import org.springframework.context.annotation.AnnotationConfigApplicationContext; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.core.io.ClassPathResource; + +@Configuration +@EnableBatchProcessing +public class MyJob { + + @Bean + public FlatFileItemReader itemReader() { + return new FlatFileItemReaderBuilder() + .name("fragmentReader") + .resource(new ClassPathResource("data.txt")) + .lineMapper(new PassThroughLineMapper()) + .bufferedReaderFactory((resource, encoding) -> + new FixedLengthBufferedReader(new InputStreamReader(resource.getInputStream(), encoding))) + .build(); + } + + @Bean + public ItemWriter itemWriter() { + return items -> items.forEach(System.out::println); + } + + @Bean + public Job job(JobBuilderFactory jobs, StepBuilderFactory steps) { + return jobs.get("job") + .start(steps.get("step") + .chunk(2) + .reader(itemReader()) + .writer(itemWriter()) + .build()) + .build(); + } + + public static void main(String[] args) throws Exception { + ApplicationContext context = new AnnotationConfigApplicationContext(MyJob.class); + JobLauncher jobLauncher = context.getBean(JobLauncher.class); + Job job = context.getBean(Job.class); + jobLauncher.run(job, new JobParameters()); + } + +} diff --git a/gh1064/src/main/resources/data.txt b/gh1064/src/main/resources/data.txt new file mode 100644 index 0000000..9f4d667 --- /dev/null +++ b/gh1064/src/main/resources/data.txt @@ -0,0 +1 @@ +Sale012016 1 00000011000000000Sale022017 2 00000022000000000Sale032018 3 00000033000000000