From 3d19adfe7386549677170f8c6946398256775b14 Mon Sep 17 00:00:00 2001 From: Taeik Lim Date: Sun, 13 Nov 2022 03:32:38 +0900 Subject: [PATCH] Move enhance method to AbstractJob --- .../batch/core/job/AbstractJob.java | 32 ++++ .../batch/core/job/CommonJobProperties.java | 134 ++++++++++++++ .../core/job/builder/FlowJobBuilder.java | 3 +- .../core/job/builder/JobBuilderHelper.java | 166 ++---------------- .../core/job/builder/SimpleJobBuilder.java | 3 +- 5 files changed, 183 insertions(+), 155 deletions(-) create mode 100644 spring-batch-core/src/main/java/org/springframework/batch/core/job/CommonJobProperties.java diff --git a/spring-batch-core/src/main/java/org/springframework/batch/core/job/AbstractJob.java b/spring-batch-core/src/main/java/org/springframework/batch/core/job/AbstractJob.java index 2d69bc9c61..5e920e7f8b 100644 --- a/spring-batch-core/src/main/java/org/springframework/batch/core/job/AbstractJob.java +++ b/spring-batch-core/src/main/java/org/springframework/batch/core/job/AbstractJob.java @@ -71,6 +71,7 @@ * @author Lucas Ward * @author Dave Syer * @author Mahmoud Ben Hassine + * @author Taeik Lim */ public abstract class AbstractJob implements Job, StepLocator, BeanNameAware, InitializingBean { @@ -382,6 +383,37 @@ public final void execute(JobExecution execution) { } + public void enhance(CommonJobProperties properties) { + setJobRepository(properties.getJobRepository()); + + JobParametersIncrementer jobParametersIncrementer = properties.getJobParametersIncrementer(); + if (jobParametersIncrementer != null) { + setJobParametersIncrementer(jobParametersIncrementer); + } + JobParametersValidator jobParametersValidator = properties.getJobParametersValidator(); + if (jobParametersValidator != null) { + setJobParametersValidator(jobParametersValidator); + } + ObservationRegistry observationRegistry = properties.getObservationRegistry(); + if (observationRegistry != null) { + setObservationRegistry(observationRegistry); + } + MeterRegistry meterRegistry = properties.getMeterRegistry(); + if (meterRegistry != null) { + setMeterRegistry(meterRegistry); + } + + Boolean restartable = properties.getRestartable(); + if (restartable != null) { + setRestartable(restartable); + } + + List listeners = properties.getJobExecutionListeners(); + if (!listeners.isEmpty()) { + setJobExecutionListeners(listeners.toArray(new JobExecutionListener[0])); + } + } + private void stopObservation(JobExecution execution, Observation observation) { List throwables = execution.getFailureExceptions(); if (!throwables.isEmpty()) { diff --git a/spring-batch-core/src/main/java/org/springframework/batch/core/job/CommonJobProperties.java b/spring-batch-core/src/main/java/org/springframework/batch/core/job/CommonJobProperties.java new file mode 100644 index 0000000000..4f2dab897f --- /dev/null +++ b/spring-batch-core/src/main/java/org/springframework/batch/core/job/CommonJobProperties.java @@ -0,0 +1,134 @@ +/* + * Copyright 2006-2022 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.springframework.batch.core.job; + +import java.util.ArrayList; +import java.util.LinkedHashSet; +import java.util.List; +import java.util.Set; + +import io.micrometer.core.instrument.MeterRegistry; +import io.micrometer.observation.ObservationRegistry; + +import org.springframework.batch.core.Job; +import org.springframework.batch.core.JobExecutionListener; +import org.springframework.batch.core.JobParametersIncrementer; +import org.springframework.batch.core.JobParametersValidator; +import org.springframework.batch.core.repository.JobRepository; + +/** + * A common properties for {@link Job}. + * + * @author Taeik Lim + */ +public class CommonJobProperties { + + private String name; + + private boolean restartable = true; + + private JobRepository jobRepository; + + private ObservationRegistry observationRegistry; + + private MeterRegistry meterRegistry; + + private JobParametersIncrementer jobParametersIncrementer; + + private JobParametersValidator jobParametersValidator; + + private Set jobExecutionListeners = new LinkedHashSet<>(); + + public CommonJobProperties() { + } + + public CommonJobProperties(CommonJobProperties properties) { + this.name = properties.name; + this.restartable = properties.restartable; + this.jobRepository = properties.jobRepository; + this.observationRegistry = properties.observationRegistry; + this.meterRegistry = properties.meterRegistry; + this.jobParametersIncrementer = properties.jobParametersIncrementer; + this.jobParametersValidator = properties.jobParametersValidator; + this.jobExecutionListeners = new LinkedHashSet<>(properties.jobExecutionListeners); + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public boolean getRestartable() { + return restartable; + } + + public void setRestartable(boolean restartable) { + this.restartable = restartable; + } + + public JobRepository getJobRepository() { + return jobRepository; + } + + public void setJobRepository(JobRepository jobRepository) { + this.jobRepository = jobRepository; + } + + public ObservationRegistry getObservationRegistry() { + return observationRegistry; + } + + public void setObservationRegistry(ObservationRegistry observationRegistry) { + this.observationRegistry = observationRegistry; + } + + public MeterRegistry getMeterRegistry() { + return meterRegistry; + } + + public void setMeterRegistry(MeterRegistry meterRegistry) { + this.meterRegistry = meterRegistry; + } + + public JobParametersIncrementer getJobParametersIncrementer() { + return jobParametersIncrementer; + } + + public void setJobParametersIncrementer(JobParametersIncrementer jobParametersIncrementer) { + this.jobParametersIncrementer = jobParametersIncrementer; + } + + public JobParametersValidator getJobParametersValidator() { + return jobParametersValidator; + } + + public void setJobParametersValidator(JobParametersValidator jobParametersValidator) { + this.jobParametersValidator = jobParametersValidator; + } + + public List getJobExecutionListeners() { + return new ArrayList<>(jobExecutionListeners); + } + + public void addJobExecutionListener(JobExecutionListener jobExecutionListener) { + this.jobExecutionListeners.add(jobExecutionListener); + } + +} diff --git a/spring-batch-core/src/main/java/org/springframework/batch/core/job/builder/FlowJobBuilder.java b/spring-batch-core/src/main/java/org/springframework/batch/core/job/builder/FlowJobBuilder.java index 883f35c1a8..d246dc59f3 100644 --- a/spring-batch-core/src/main/java/org/springframework/batch/core/job/builder/FlowJobBuilder.java +++ b/spring-batch-core/src/main/java/org/springframework/batch/core/job/builder/FlowJobBuilder.java @@ -26,6 +26,7 @@ * nested flow composed of steps and conditional transitions between steps. * * @author Dave Syer + * @author Taeik Lim * @since 2.2 */ public class FlowJobBuilder extends JobBuilderHelper { @@ -79,7 +80,7 @@ public Job build() { FlowJob job = new FlowJob(); job.setName(getName()); job.setFlow(flow); - super.enhance(job); + job.enhance(properties); try { job.afterPropertiesSet(); } diff --git a/spring-batch-core/src/main/java/org/springframework/batch/core/job/builder/JobBuilderHelper.java b/spring-batch-core/src/main/java/org/springframework/batch/core/job/builder/JobBuilderHelper.java index 9f200da10a..2b15054f16 100644 --- a/spring-batch-core/src/main/java/org/springframework/batch/core/job/builder/JobBuilderHelper.java +++ b/spring-batch-core/src/main/java/org/springframework/batch/core/job/builder/JobBuilderHelper.java @@ -16,9 +16,7 @@ package org.springframework.batch.core.job.builder; import java.lang.reflect.Method; -import java.util.ArrayList; import java.util.HashSet; -import java.util.LinkedHashSet; import java.util.List; import java.util.Set; @@ -34,6 +32,7 @@ import org.springframework.batch.core.annotation.AfterJob; import org.springframework.batch.core.annotation.BeforeJob; import org.springframework.batch.core.job.AbstractJob; +import org.springframework.batch.core.job.CommonJobProperties; import org.springframework.batch.core.listener.JobListenerFactoryBean; import org.springframework.batch.core.repository.JobRepository; import org.springframework.batch.support.ReflectionUtils; @@ -44,17 +43,18 @@ * * @author Dave Syer * @author Mahmoud Ben Hassine + * @author Taeik Lim * @since 2.2 */ public abstract class JobBuilderHelper> { protected final Log logger = LogFactory.getLog(getClass()); - private final CommonJobProperties properties; + protected final CommonJobProperties properties; public JobBuilderHelper(String name) { this.properties = new CommonJobProperties(); - properties.name = name; + properties.setName(name); } /** @@ -72,7 +72,7 @@ protected JobBuilderHelper(JobBuilderHelper parent) { * @return this to enable fluent chaining */ public B validator(JobParametersValidator jobParametersValidator) { - properties.jobParametersValidator = jobParametersValidator; + properties.setJobParametersValidator(jobParametersValidator); @SuppressWarnings("unchecked") B result = (B) this; return result; @@ -84,7 +84,7 @@ public B validator(JobParametersValidator jobParametersValidator) { * @return this to enable fluent chaining */ public B incrementer(JobParametersIncrementer jobParametersIncrementer) { - properties.jobParametersIncrementer = jobParametersIncrementer; + properties.setJobParametersIncrementer(jobParametersIncrementer); @SuppressWarnings("unchecked") B result = (B) this; return result; @@ -96,7 +96,7 @@ public B incrementer(JobParametersIncrementer jobParametersIncrementer) { * @return this to enable fluent chaining */ public B repository(JobRepository jobRepository) { - properties.jobRepository = jobRepository; + properties.setJobRepository(jobRepository); @SuppressWarnings("unchecked") B result = (B) this; return result; @@ -108,7 +108,7 @@ public B repository(JobRepository jobRepository) { * @return this to enable fluent chaining */ public B observationRegistry(ObservationRegistry observationRegistry) { - properties.observationRegistry = observationRegistry; + properties.setObservationRegistry(observationRegistry); @SuppressWarnings("unchecked") B result = (B) this; return result; @@ -120,7 +120,7 @@ public B observationRegistry(ObservationRegistry observationRegistry) { * @return this to enable fluent chaining */ public B meterRegistry(MeterRegistry meterRegistry) { - properties.meterRegistry = meterRegistry; + properties.setMeterRegistry(meterRegistry); @SuppressWarnings("unchecked") B result = (B) this; return result; @@ -164,162 +164,22 @@ public B listener(JobExecutionListener listener) { * @return this to enable fluent chaining */ public B preventRestart() { - properties.restartable = false; + properties.setRestartable(false); @SuppressWarnings("unchecked") B result = (B) this; return result; } protected String getName() { - return properties.name; + return properties.getName(); } protected JobRepository getJobRepository() { - return properties.jobRepository; + return properties.getJobRepository(); } protected boolean isRestartable() { - return properties.restartable; - } - - protected void enhance(Job target) { - - if (target instanceof AbstractJob) { - - AbstractJob job = (AbstractJob) target; - job.setJobRepository(properties.getJobRepository()); - - JobParametersIncrementer jobParametersIncrementer = properties.getJobParametersIncrementer(); - if (jobParametersIncrementer != null) { - job.setJobParametersIncrementer(jobParametersIncrementer); - } - JobParametersValidator jobParametersValidator = properties.getJobParametersValidator(); - if (jobParametersValidator != null) { - job.setJobParametersValidator(jobParametersValidator); - } - ObservationRegistry observationRegistry = properties.getObservationRegistry(); - if (observationRegistry != null) { - job.setObservationRegistry(observationRegistry); - } - MeterRegistry meterRegistry = properties.getMeterRegistry(); - if (meterRegistry != null) { - job.setMeterRegistry(meterRegistry); - } - - Boolean restartable = properties.getRestartable(); - if (restartable != null) { - job.setRestartable(restartable); - } - - List listeners = properties.getJobExecutionListeners(); - if (!listeners.isEmpty()) { - job.setJobExecutionListeners(listeners.toArray(new JobExecutionListener[0])); - } - - } - - } - - public static class CommonJobProperties { - - private Set jobExecutionListeners = new LinkedHashSet<>(); - - private boolean restartable = true; - - private JobRepository jobRepository; - - private ObservationRegistry observationRegistry; - - private MeterRegistry meterRegistry; - - private JobParametersIncrementer jobParametersIncrementer; - - private JobParametersValidator jobParametersValidator; - - public CommonJobProperties() { - } - - public CommonJobProperties(CommonJobProperties properties) { - this.name = properties.name; - this.restartable = properties.restartable; - this.jobRepository = properties.jobRepository; - this.observationRegistry = properties.observationRegistry; - this.meterRegistry = properties.meterRegistry; - this.jobExecutionListeners = new LinkedHashSet<>(properties.jobExecutionListeners); - this.jobParametersIncrementer = properties.jobParametersIncrementer; - this.jobParametersValidator = properties.jobParametersValidator; - } - - public JobParametersIncrementer getJobParametersIncrementer() { - return jobParametersIncrementer; - } - - public void setJobParametersIncrementer(JobParametersIncrementer jobParametersIncrementer) { - this.jobParametersIncrementer = jobParametersIncrementer; - } - - public JobParametersValidator getJobParametersValidator() { - return jobParametersValidator; - } - - public void setJobParametersValidator(JobParametersValidator jobParametersValidator) { - this.jobParametersValidator = jobParametersValidator; - } - - public JobRepository getJobRepository() { - return jobRepository; - } - - public void setJobRepository(JobRepository jobRepository) { - this.jobRepository = jobRepository; - } - - public ObservationRegistry getObservationRegistry() { - return observationRegistry; - } - - public void setObservationRegistry(ObservationRegistry observationRegistry) { - this.observationRegistry = observationRegistry; - } - - public MeterRegistry getMeterRegistry() { - return meterRegistry; - } - - public void setMeterRegistry(MeterRegistry meterRegistry) { - this.meterRegistry = meterRegistry; - } - - public String getName() { - return name; - } - - public void setName(String name) { - this.name = name; - } - - public List getJobExecutionListeners() { - return new ArrayList<>(jobExecutionListeners); - } - - public void addStepExecutionListeners(List jobExecutionListeners) { - this.jobExecutionListeners.addAll(jobExecutionListeners); - } - - public void addJobExecutionListener(JobExecutionListener jobExecutionListener) { - this.jobExecutionListeners.add(jobExecutionListener); - } - - public boolean getRestartable() { - return restartable; - } - - public void setRestartable(boolean restartable) { - this.restartable = restartable; - } - - private String name; - + return properties.getRestartable(); } } diff --git a/spring-batch-core/src/main/java/org/springframework/batch/core/job/builder/SimpleJobBuilder.java b/spring-batch-core/src/main/java/org/springframework/batch/core/job/builder/SimpleJobBuilder.java index f881e66cf8..3b2899afbb 100644 --- a/spring-batch-core/src/main/java/org/springframework/batch/core/job/builder/SimpleJobBuilder.java +++ b/spring-batch-core/src/main/java/org/springframework/batch/core/job/builder/SimpleJobBuilder.java @@ -27,6 +27,7 @@ /** * @author Dave Syer + * @author Taeik Lim * @since 2.2 * */ @@ -50,7 +51,7 @@ public Job build() { return builder.end().build(); } SimpleJob job = new SimpleJob(getName()); - super.enhance(job); + job.enhance(properties); job.setSteps(steps); try { job.afterPropertiesSet();