From b0f62f4eca44689176c126356066694dd02155ef Mon Sep 17 00:00:00 2001 From: Amitabh Mandal Date: Thu, 20 Dec 2018 11:23:53 +0530 Subject: [PATCH] BAEL-2168 Java EE 7 batch processing (#5861) * review changes * Fixed public static count * review comments --- .../batch/understanding/CustomCheckPoint.java | 12 ++++++++- .../understanding/InjectSimpleBatchLet.java | 20 +++++++++++++- .../understanding/SimpleChunkItemReader.java | 13 ++++++++-- .../SimpleChunkItemReaderError.java | 9 +++++-- .../understanding/SimpleChunkWriter.java | 3 +++ .../batch-jobs/injectionSimpleBatchLet.xml | 26 +++++++++++-------- .../batch-jobs/partitionSimpleBatchLet.xml | 6 +++++ .../batch/understanding/BatchTestHelper.java | 11 ++++++++ .../CustomCheckPointUnitTest.java | 9 ++++--- .../understanding/SimpleBatchLetUnitTest.java | 7 ----- .../SimpleErrorChunkUnitTest.java | 10 +++---- 11 files changed, 93 insertions(+), 33 deletions(-) diff --git a/jee-7/src/main/java/com/baeldung/batch/understanding/CustomCheckPoint.java b/jee-7/src/main/java/com/baeldung/batch/understanding/CustomCheckPoint.java index fe6759b365..ba4eeb9da8 100644 --- a/jee-7/src/main/java/com/baeldung/batch/understanding/CustomCheckPoint.java +++ b/jee-7/src/main/java/com/baeldung/batch/understanding/CustomCheckPoint.java @@ -1,12 +1,22 @@ package com.baeldung.batch.understanding; import javax.batch.api.chunk.AbstractCheckpointAlgorithm; +import javax.batch.runtime.context.JobContext; +import javax.inject.Inject; import javax.inject.Named; @Named public class CustomCheckPoint extends AbstractCheckpointAlgorithm { + + @Inject + JobContext jobContext; + + private Integer counterRead = 0; + @Override public boolean isReadyToCheckpoint() throws Exception { - return SimpleChunkItemReader.COUNT % 5 == 0; + counterRead = (Integer)jobContext.getTransientUserData(); + System.out.println("counterRead : " + counterRead); + return counterRead % 5 == 0; } } diff --git a/jee-7/src/main/java/com/baeldung/batch/understanding/InjectSimpleBatchLet.java b/jee-7/src/main/java/com/baeldung/batch/understanding/InjectSimpleBatchLet.java index 93eb20708d..ccc052b44b 100644 --- a/jee-7/src/main/java/com/baeldung/batch/understanding/InjectSimpleBatchLet.java +++ b/jee-7/src/main/java/com/baeldung/batch/understanding/InjectSimpleBatchLet.java @@ -1,20 +1,38 @@ package com.baeldung.batch.understanding; +import java.util.Properties; +import java.util.logging.Logger; + import javax.batch.api.AbstractBatchlet; import javax.batch.api.BatchProperty; import javax.batch.runtime.BatchStatus; +import javax.batch.runtime.context.JobContext; +import javax.batch.runtime.context.StepContext; import javax.inject.Inject; import javax.inject.Named; @Named public class InjectSimpleBatchLet extends AbstractBatchlet { + Logger logger = Logger.getLogger(InjectSimpleBatchLet.class.getName()); + @Inject @BatchProperty(name = "name") private String nameString; + @Inject + StepContext stepContext; + private Properties stepProperties; + @Inject + JobContext jobContext; + private Properties jobProperties; + @Override public String process() throws Exception { - System.out.println("Value passed in = " + nameString); + logger.info("BatchProperty : " + nameString); + stepProperties = stepContext.getProperties(); + jobProperties = jobContext.getProperties(); + logger.info("Step property : "+ stepProperties.getProperty("stepProp1")); + logger.info("job property : "+jobProperties.getProperty("jobProp1")); return BatchStatus.COMPLETED.toString(); } } diff --git a/jee-7/src/main/java/com/baeldung/batch/understanding/SimpleChunkItemReader.java b/jee-7/src/main/java/com/baeldung/batch/understanding/SimpleChunkItemReader.java index 10f81d95d0..7d66edc74c 100644 --- a/jee-7/src/main/java/com/baeldung/batch/understanding/SimpleChunkItemReader.java +++ b/jee-7/src/main/java/com/baeldung/batch/understanding/SimpleChunkItemReader.java @@ -1,20 +1,28 @@ package com.baeldung.batch.understanding; import java.io.Serializable; +import java.util.Properties; import java.util.StringTokenizer; import javax.batch.api.chunk.AbstractItemReader; +import javax.batch.runtime.BatchStatus; +import javax.batch.runtime.context.JobContext; +import javax.inject.Inject; import javax.inject.Named; @Named public class SimpleChunkItemReader extends AbstractItemReader { private StringTokenizer tokens; - public static int COUNT = 0; + private Integer count=0; + + @Inject + JobContext jobContext; @Override public Integer readItem() throws Exception { if (tokens.hasMoreTokens()) { - COUNT++; + this.count++; String tempTokenize = tokens.nextToken(); + jobContext.setTransientUserData(count); return Integer.valueOf(tempTokenize); } return null; @@ -24,4 +32,5 @@ public class SimpleChunkItemReader extends AbstractItemReader { public void open(Serializable checkpoint) throws Exception { tokens = new StringTokenizer("1,2,3,4,5,6,7,8,9,10", ","); } + } diff --git a/jee-7/src/main/java/com/baeldung/batch/understanding/SimpleChunkItemReaderError.java b/jee-7/src/main/java/com/baeldung/batch/understanding/SimpleChunkItemReaderError.java index 92096d0571..f51426339f 100644 --- a/jee-7/src/main/java/com/baeldung/batch/understanding/SimpleChunkItemReaderError.java +++ b/jee-7/src/main/java/com/baeldung/batch/understanding/SimpleChunkItemReaderError.java @@ -4,17 +4,22 @@ import java.io.Serializable; import java.util.StringTokenizer; import javax.batch.api.chunk.AbstractItemReader; +import javax.batch.runtime.context.JobContext; +import javax.inject.Inject; import javax.inject.Named; @Named public class SimpleChunkItemReaderError extends AbstractItemReader { + @Inject + JobContext jobContext; private StringTokenizer tokens; - public static int COUNT = 0; + private Integer count = 0; @Override public Integer readItem() throws Exception { if (tokens.hasMoreTokens()) { - COUNT++; + count++; + jobContext.setTransientUserData(count); int token = Integer.valueOf(tokens.nextToken()); if (token == 3) { throw new RuntimeException("Something happened"); diff --git a/jee-7/src/main/java/com/baeldung/batch/understanding/SimpleChunkWriter.java b/jee-7/src/main/java/com/baeldung/batch/understanding/SimpleChunkWriter.java index 909596766d..f21dd77b85 100644 --- a/jee-7/src/main/java/com/baeldung/batch/understanding/SimpleChunkWriter.java +++ b/jee-7/src/main/java/com/baeldung/batch/understanding/SimpleChunkWriter.java @@ -1,5 +1,6 @@ package com.baeldung.batch.understanding; +import java.util.ArrayList; import java.util.List; import javax.batch.api.chunk.AbstractItemWriter; @@ -7,7 +8,9 @@ import javax.inject.Named; @Named public class SimpleChunkWriter extends AbstractItemWriter { + List processed = new ArrayList<>(); @Override public void writeItems(List items) throws Exception { + items.stream().map(Integer.class::cast).forEach(this.processed::add); } } diff --git a/jee-7/src/main/resources/META-INF/batch-jobs/injectionSimpleBatchLet.xml b/jee-7/src/main/resources/META-INF/batch-jobs/injectionSimpleBatchLet.xml index d152f063f6..39cb043dcf 100644 --- a/jee-7/src/main/resources/META-INF/batch-jobs/injectionSimpleBatchLet.xml +++ b/jee-7/src/main/resources/META-INF/batch-jobs/injectionSimpleBatchLet.xml @@ -1,13 +1,17 @@ - - - - - - - - + + + + + + + + + + + \ No newline at end of file diff --git a/jee-7/src/main/resources/META-INF/batch-jobs/partitionSimpleBatchLet.xml b/jee-7/src/main/resources/META-INF/batch-jobs/partitionSimpleBatchLet.xml index 76c64ee899..49495072ea 100644 --- a/jee-7/src/main/resources/META-INF/batch-jobs/partitionSimpleBatchLet.xml +++ b/jee-7/src/main/resources/META-INF/batch-jobs/partitionSimpleBatchLet.xml @@ -4,7 +4,13 @@ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/jobXML_1_0.xsd" version="1.0"> + + + + + + diff --git a/jee-7/src/test/java/com/baeldung/batch/understanding/BatchTestHelper.java b/jee-7/src/test/java/com/baeldung/batch/understanding/BatchTestHelper.java index 5060bd9b91..56269809f3 100644 --- a/jee-7/src/test/java/com/baeldung/batch/understanding/BatchTestHelper.java +++ b/jee-7/src/test/java/com/baeldung/batch/understanding/BatchTestHelper.java @@ -7,6 +7,7 @@ import javax.batch.runtime.BatchRuntime; import javax.batch.runtime.BatchStatus; import javax.batch.runtime.JobExecution; import javax.batch.runtime.Metric; +import javax.batch.runtime.StepExecution; public class BatchTestHelper { private static final int MAX_TRIES = 40; @@ -68,6 +69,16 @@ public class BatchTestHelper { return jobExecution; } + public static long getCommitCount(StepExecution stepExecution) { + Map metricsMap = getMetricsMap(stepExecution.getMetrics()); + return metricsMap.get(Metric.MetricType.COMMIT_COUNT); + } + + public static long getProcessSkipCount(StepExecution stepExecution) { + Map metricsMap = getMetricsMap(stepExecution.getMetrics()); + return metricsMap.get(Metric.MetricType.PROCESS_SKIP_COUNT); + } + public static Map getMetricsMap(Metric[] metrics) { Map metricsMap = new HashMap<>(); for (Metric metric : metrics) { diff --git a/jee-7/src/test/java/com/baeldung/batch/understanding/CustomCheckPointUnitTest.java b/jee-7/src/test/java/com/baeldung/batch/understanding/CustomCheckPointUnitTest.java index a9488c5c03..dfea878a75 100644 --- a/jee-7/src/test/java/com/baeldung/batch/understanding/CustomCheckPointUnitTest.java +++ b/jee-7/src/test/java/com/baeldung/batch/understanding/CustomCheckPointUnitTest.java @@ -15,7 +15,7 @@ import org.junit.jupiter.api.Test; class CustomCheckPointUnitTest { @Test - public void givenChunk_whenCustomCheckPoint_thenCommitCount_3() throws Exception { + public void givenChunk_whenCustomCheckPoint_thenCommitCountIsThree() throws Exception { JobOperator jobOperator = BatchRuntime.getJobOperator(); Long executionId = jobOperator.start("customCheckPoint", new Properties()); JobExecution jobExecution = jobOperator.getJobExecution(executionId); @@ -23,9 +23,10 @@ class CustomCheckPointUnitTest { for (StepExecution stepExecution : jobOperator.getStepExecutions(executionId)) { if (stepExecution.getStepName() .equals("firstChunkStep")) { - Map metricsMap = BatchTestHelper.getMetricsMap(stepExecution.getMetrics()); - assertEquals(3L, metricsMap.get(Metric.MetricType.COMMIT_COUNT) - .longValue()); + jobOperator.getStepExecutions(executionId) + .stream() + .map(BatchTestHelper::getCommitCount) + .forEach(count -> assertEquals(3L, count.longValue())); } } assertEquals(jobExecution.getBatchStatus(), BatchStatus.COMPLETED); diff --git a/jee-7/src/test/java/com/baeldung/batch/understanding/SimpleBatchLetUnitTest.java b/jee-7/src/test/java/com/baeldung/batch/understanding/SimpleBatchLetUnitTest.java index 485c997cc6..ade492b1b9 100644 --- a/jee-7/src/test/java/com/baeldung/batch/understanding/SimpleBatchLetUnitTest.java +++ b/jee-7/src/test/java/com/baeldung/batch/understanding/SimpleBatchLetUnitTest.java @@ -1,18 +1,11 @@ package com.baeldung.batch.understanding; import static org.junit.jupiter.api.Assertions.*; - -import java.util.List; -import java.util.Map; import java.util.Properties; - import javax.batch.operations.JobOperator; import javax.batch.runtime.BatchRuntime; import javax.batch.runtime.BatchStatus; import javax.batch.runtime.JobExecution; -import javax.batch.runtime.Metric; -import javax.batch.runtime.StepExecution; - import org.junit.jupiter.api.Test; class SimpleBatchLetUnitTest { diff --git a/jee-7/src/test/java/com/baeldung/batch/understanding/SimpleErrorChunkUnitTest.java b/jee-7/src/test/java/com/baeldung/batch/understanding/SimpleErrorChunkUnitTest.java index 0f6d068888..ded31b6345 100644 --- a/jee-7/src/test/java/com/baeldung/batch/understanding/SimpleErrorChunkUnitTest.java +++ b/jee-7/src/test/java/com/baeldung/batch/understanding/SimpleErrorChunkUnitTest.java @@ -1,5 +1,6 @@ package com.baeldung.batch.understanding; +import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertTrue; import static org.junit.jupiter.api.Assertions.*; @@ -23,7 +24,6 @@ class SimpleErrorChunkUnitTest { Long executionId = jobOperator.start("simpleErrorChunk", new Properties()); JobExecution jobExecution = jobOperator.getJobExecution(executionId); jobExecution = BatchTestHelper.keepTestFailed(jobExecution); - System.out.println(jobExecution.getBatchStatus()); assertEquals(jobExecution.getBatchStatus(), BatchStatus.FAILED); } @@ -37,10 +37,10 @@ class SimpleErrorChunkUnitTest { for (StepExecution stepExecution : stepExecutions) { if (stepExecution.getStepName() .equals("errorStep")) { - Map metricsMap = BatchTestHelper.getMetricsMap(stepExecution.getMetrics()); - long skipCount = metricsMap.get(MetricType.PROCESS_SKIP_COUNT) - .longValue(); - assertTrue("Skip count=" + skipCount, skipCount == 1l || skipCount == 2l); + jobOperator.getStepExecutions(executionId) + .stream() + .map(BatchTestHelper::getProcessSkipCount) + .forEach(skipCount -> assertEquals(1L, skipCount.longValue())); } } assertEquals(jobExecution.getBatchStatus(), BatchStatus.COMPLETED);