[BAEL-3646] Addressing PR comments

This commit is contained in:
mike b
2020-03-17 10:06:34 -04:00
parent 2c0cf3e2e0
commit e58683f48b
16 changed files with 208 additions and 121 deletions
@@ -1,11 +1,14 @@
package org.baeldung.conditionalflow;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.boot.CommandLineRunner;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
@SpringBootApplication
public class ConditionalFlowApplication implements CommandLineRunner {
private static Logger logger = LoggerFactory.getLogger(ConditionalFlowApplication.class);
public static void main(String[] args) {
SpringApplication.run(ConditionalFlowApplication.class, args);
@@ -13,6 +16,6 @@ public class ConditionalFlowApplication implements CommandLineRunner {
@Override
public void run(String... args) throws Exception {
System.out.println("Running and exiting");
logger.info("Running conditional flow application...");
}
}
@@ -1,6 +1,5 @@
package org.baeldung.conditionalflow;
import org.springframework.batch.core.ExitStatus;
import org.springframework.batch.core.JobExecution;
import org.springframework.batch.core.StepExecution;
import org.springframework.batch.core.job.flow.FlowExecutionStatus;
@@ -8,12 +7,23 @@ import org.springframework.batch.core.job.flow.JobExecutionDecider;
public class NumberInfoDecider implements JobExecutionDecider {
public static final String NOTIFY = "NOTIFY";
public static final String QUIET = "QUIET";
/**
* Method that determines notification status of job
* @return true if notifications should be sent.
*/
private boolean shouldNotify() {
return true;
}
@Override
public FlowExecutionStatus decide(JobExecution jobExecution, StepExecution stepExecution) {
if(jobExecution.getExitStatus().equals("UNKNOWN")) {
return new FlowExecutionStatus("NOTIFY");
if (shouldNotify()) {
return new FlowExecutionStatus(NOTIFY);
} else {
return null;
return new FlowExecutionStatus(QUIET);
}
}
}
@@ -11,6 +11,9 @@ import org.springframework.batch.core.configuration.annotation.StepBuilderFactor
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Primary;
import static org.baeldung.conditionalflow.NumberInfoDecider.NOTIFY;
@Configuration
@EnableBatchProcessing
@@ -19,67 +22,70 @@ public class NumberInfoConfig {
@Bean
@Qualifier("NotificationStep")
public Step notificationStep(StepBuilderFactory sbf) {
return sbf.get("Billing step").tasklet(new NotifierTasklet()).build();
return sbf.get("Notify step")
.tasklet(new NotifierTasklet())
.build();
}
public Step numberGeneratorStep(StepBuilderFactory sbf, int[] values, String prepend) {
return sbf.get("Number generator")
.<NumberInfo, Integer>chunk(1)
.reader(new NumberInfoGenerator(values))
.processor(new NumberInfoClassifier())
.writer(new PrependingStdoutWriter<>(prepend))
.build();
.<NumberInfo, Integer> chunk(1)
.reader(new NumberInfoGenerator(values))
.processor(new NumberInfoClassifier())
.writer(new PrependingStdoutWriter<>(prepend))
.build();
}
public Step numberGeneratorStepDecider(StepBuilderFactory sbf, int[] values, String prepend) {
return sbf.get("Number generator")
.<NumberInfo, Integer>chunk(1)
.reader(new NumberInfoGenerator(values))
.processor(new NumberInfoClassifierWithDecider())
.writer(new PrependingStdoutWriter<>(prepend))
.build();
return sbf.get("Number generator decider")
.<NumberInfo, Integer> chunk(1)
.reader(new NumberInfoGenerator(values))
.processor(new NumberInfoClassifierWithDecider())
.writer(new PrependingStdoutWriter<>(prepend))
.build();
}
@Bean
public Job numberGeneratorNonNotifierJob(JobBuilderFactory jobBuilderFactory,
StepBuilderFactory stepBuilderFactory,
@Qualifier("NotificationStep") Step notificationStep
) {
int[] nonNotifierData = {-1, -2, -3};
@Qualifier("first_job")
public Job numberGeneratorNonNotifierJob(JobBuilderFactory jobBuilderFactory, StepBuilderFactory stepBuilderFactory, @Qualifier("NotificationStep") Step notificationStep) {
int[] nonNotifierData = { -1, -2, -3 };
Step step = numberGeneratorStep(stepBuilderFactory, nonNotifierData, "First Dataset Processor");
return jobBuilderFactory.get("Number generator - first dataset")
.start(step)
.on("NOTIFY").to(notificationStep)
.from(step).on("*").stop()
.end()
.build();
.start(step)
.on(NOTIFY)
.to(notificationStep)
.from(step)
.on("*")
.stop()
.end()
.build();
}
@Bean
public Job numberGeneratorNotifierJob(JobBuilderFactory jobBuilderFactory,
StepBuilderFactory stepBuilderFactory,
@Qualifier("NotificationStep") Step notificationStep
) {
int[] billableData = {11, -2, -3};
@Qualifier("second_job")
public Job numberGeneratorNotifierJob(JobBuilderFactory jobBuilderFactory, StepBuilderFactory stepBuilderFactory, @Qualifier("NotificationStep") Step notificationStep) {
int[] billableData = { 11, -2, -3 };
Step dataProviderStep = numberGeneratorStep(stepBuilderFactory, billableData, "Second Dataset Processor");
return jobBuilderFactory.get("Number generator - second dataset")
.start(dataProviderStep)
.on("NOTIFY").to(notificationStep)
.end()
.build();
.start(dataProviderStep)
.on(NOTIFY)
.to(notificationStep)
.end()
.build();
}
@Bean
public Job numberGeneratorNotifierJobWithDecider(JobBuilderFactory jobBuilderFactory,
StepBuilderFactory stepBuilderFactory,
@Qualifier("NotificationStep") Step notificationStep
) {
int[] billableData = {11, -2, -3};
@Qualifier("third_job")
@Primary
public Job numberGeneratorNotifierJobWithDecider(JobBuilderFactory jobBuilderFactory, StepBuilderFactory stepBuilderFactory, @Qualifier("NotificationStep") Step notificationStep) {
int[] billableData = { 11, -2, -3 };
Step dataProviderStep = numberGeneratorStepDecider(stepBuilderFactory, billableData, "Third Dataset Processor");
return jobBuilderFactory.get("Number generator - third dataset")
.start(dataProviderStep)
.next(new NumberInfoDecider()).on("NOTIFY").to(notificationStep)
.end()
.build();
.start(dataProviderStep)
.next(new NumberInfoDecider())
.on(NOTIFY)
.to(notificationStep)
.end()
.build();
}
}
@@ -5,14 +5,14 @@ import java.util.Objects;
public class NumberInfo {
private int number;
public static NumberInfo from(int number){
return new NumberInfo(number);
}
public NumberInfo(int number) {
this.number = number;
}
public static NumberInfo from(int number) {
return new NumberInfo(number);
}
public boolean isPositive() {
return number > 0;
}
@@ -27,8 +27,10 @@ public class NumberInfo {
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
if (this == o)
return true;
if (o == null || getClass() != o.getClass())
return false;
NumberInfo that = (NumberInfo) o;
return number == that.number;
}
@@ -40,8 +42,6 @@ public class NumberInfo {
@Override
public String toString() {
return "NumberInfo{" +
"number=" + number +
'}';
return "NumberInfo{" + "number=" + number + '}';
}
}
@@ -8,7 +8,8 @@ import org.springframework.batch.repeat.RepeatStatus;
public class NotifierTasklet implements Tasklet {
@Override
public RepeatStatus execute(StepContribution stepContribution, ChunkContext chunkContext) throws Exception {
System.err.println("[" + chunkContext.getStepContext().getJobName() + "] contains interesting data!!");
System.err.println("[" + chunkContext.getStepContext()
.getJobName() + "] contains interesting data!!");
return RepeatStatus.FINISHED;
}
}
@@ -7,20 +7,23 @@ import org.springframework.batch.core.annotation.BeforeStep;
import org.springframework.batch.core.listener.ItemListenerSupport;
import org.springframework.batch.item.ItemProcessor;
public class NumberInfoClassifier extends ItemListenerSupport<NumberInfo, Integer>
implements ItemProcessor<NumberInfo, Integer> {
import static org.baeldung.conditionalflow.NumberInfoDecider.NOTIFY;
import static org.baeldung.conditionalflow.NumberInfoDecider.QUIET;
public class NumberInfoClassifier extends ItemListenerSupport<NumberInfo, Integer> implements ItemProcessor<NumberInfo, Integer> {
private StepExecution stepExecution;
@BeforeStep
public void beforeStep(StepExecution stepExecution) {
this.stepExecution = stepExecution;
this.stepExecution.setExitStatus(new ExitStatus(QUIET));
}
@Override
public void afterProcess(NumberInfo item, Integer result) {
super.afterProcess(item, result);
if (item.isPositive()) {
stepExecution.setExitStatus(new ExitStatus("NOTIFY"));
stepExecution.setExitStatus(new ExitStatus(NOTIFY));
}
}
@@ -1,15 +1,17 @@
package org.baeldung.conditionalflow.step;
import org.baeldung.conditionalflow.model.NumberInfo;
import org.springframework.batch.core.ExitStatus;
import org.springframework.batch.core.StepExecution;
import org.springframework.batch.core.annotation.BeforeStep;
import org.springframework.batch.core.listener.ItemListenerSupport;
import org.springframework.batch.item.ItemProcessor;
public class NumberInfoClassifierWithDecider
implements ItemProcessor<NumberInfo, Integer> {
private StepExecution stepExecution;
public class NumberInfoClassifierWithDecider extends ItemListenerSupport<NumberInfo, Integer> implements ItemProcessor<NumberInfo, Integer> {
@Override
public Integer process(NumberInfo numberInfo) throws Exception {
return Integer.valueOf(numberInfo.getNumber());
}
}
@@ -7,14 +7,14 @@ public class NumberInfoGenerator implements ItemReader<NumberInfo> {
private int[] values;
private int counter;
public NumberInfoGenerator(int[] values){
public NumberInfoGenerator(int[] values) {
this.values = values;
counter = 0;
}
@Override
public NumberInfo read() {
if(counter == values.length){
if (counter == values.length) {
return null;
} else {
return new NumberInfo(values[counter++]);
@@ -1,17 +0,0 @@
package org.baeldung.conditionalflow.step;
import org.baeldung.conditionalflow.model.NumberInfo;
import org.springframework.batch.core.ExitStatus;
import org.springframework.batch.core.StepExecution;
import org.springframework.batch.core.annotation.BeforeStep;
import org.springframework.batch.core.listener.ItemListenerSupport;
import org.springframework.batch.item.ItemProcessor;
public class NumberInfoProcessor implements ItemProcessor<NumberInfo, Integer> {
private StepExecution stepExecution;
@Override
public Integer process(NumberInfo numberInfo) throws Exception {
return Integer.valueOf(numberInfo.getNumber());
}
}
@@ -1,18 +1,15 @@
package org.baeldung.conditionalflow.step;
import org.springframework.batch.item.ItemWriter;
import java.io.OutputStream;
import java.util.List;
import org.springframework.batch.item.ItemWriter;
public class PrependingStdoutWriter<T> implements ItemWriter<T> {
private String prependText;
private OutputStream writeTo;
private PrependingStdoutWriter() {
}
public PrependingStdoutWriter(String prependText, OutputStream os){
public PrependingStdoutWriter(String prependText, OutputStream os) {
this.prependText = prependText;
this.writeTo = os;
}