diff --git a/pom.xml b/pom.xml
index 7e424ff4..1146d79a 100755
--- a/pom.xml
+++ b/pom.xml
@@ -5,7 +5,7 @@
org.springframework.cloud
spring-cloud-build
- 2.0.0.RELEASE
+ 2.0.5.BUILD-SNAPSHOT
@@ -132,15 +132,16 @@
- 2.0.0.RELEASE
+ 2.0.2.RELEASE
1.3.2.RELEASE
1.3.5.RELEASE
- 2.0.0.RELEASE
+ 2.0.2.RELEASE
1.3.2.RELEASE
1.3.2.RELEASE
- 4.0.1.RELEASE
+ 4.1.0.RELEASE
1.1
8.0
+ 5.3.1
UTF-8
${project.build.directory}/coverage-reports/jacoco-ut.exec
diff --git a/spring-cloud-task-batch/pom.xml b/spring-cloud-task-batch/pom.xml
index 2a8d7e86..5d2edf08 100644
--- a/spring-cloud-task-batch/pom.xml
+++ b/spring-cloud-task-batch/pom.xml
@@ -79,5 +79,11 @@
org.springframework.boot
spring-boot-test
+
+ org.junit.jupiter
+ junit-jupiter-api
+ ${junit.version}
+ test
+
diff --git a/spring-cloud-task-batch/src/main/java/org/springframework/cloud/task/batch/configuration/TaskJobLauncherAutoConfiguration.java b/spring-cloud-task-batch/src/main/java/org/springframework/cloud/task/batch/configuration/TaskJobLauncherAutoConfiguration.java
index 6350657b..1a1de459 100644
--- a/spring-cloud-task-batch/src/main/java/org/springframework/cloud/task/batch/configuration/TaskJobLauncherAutoConfiguration.java
+++ b/spring-cloud-task-batch/src/main/java/org/springframework/cloud/task/batch/configuration/TaskJobLauncherAutoConfiguration.java
@@ -18,11 +18,16 @@ package org.springframework.cloud.task.batch.configuration;
import java.util.List;
+import javax.sql.DataSource;
+
import org.springframework.batch.core.Job;
import org.springframework.batch.core.configuration.JobRegistry;
import org.springframework.batch.core.explore.JobExplorer;
import org.springframework.batch.core.launch.JobLauncher;
+import org.springframework.batch.core.repository.JobRepository;
+import org.springframework.batch.core.repository.support.JobRepositoryFactoryBean;
import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
import org.springframework.boot.context.properties.EnableConfigurationProperties;
import org.springframework.context.annotation.Bean;
@@ -42,15 +47,23 @@ public class TaskJobLauncherAutoConfiguration {
@Autowired
private TaskBatchProperties properties;
+ @Bean
+ @ConditionalOnMissingBean(JobRepository.class)
+ public JobRepository jobRepository(DataSource dataSource) throws Exception{
+ JobRepositoryFactoryBean factoryBean = new JobRepositoryFactoryBean();
+ factoryBean.setDataSource(dataSource);
+ return factoryBean.getObject();
+ }
+
@Bean
public TaskJobLauncherCommandLineRunnerFactoryBean jobLauncherCommandLineRunner(JobLauncher jobLauncher,
- JobExplorer jobExplorer, List jobs, JobRegistry jobRegistry) {
+ JobExplorer jobExplorer, List jobs, JobRegistry jobRegistry, JobRepository jobRepository) {
TaskJobLauncherCommandLineRunnerFactoryBean taskJobLauncherCommandLineRunnerFactoryBean =
new TaskJobLauncherCommandLineRunnerFactoryBean(jobLauncher,
jobExplorer,
jobs,
this.properties.getJobNames(),
- jobRegistry);
+ jobRegistry, jobRepository);
taskJobLauncherCommandLineRunnerFactoryBean.setOrder(this.properties.getCommandLineRunnerOrder());
diff --git a/spring-cloud-task-batch/src/main/java/org/springframework/cloud/task/batch/configuration/TaskJobLauncherCommandLineRunnerFactoryBean.java b/spring-cloud-task-batch/src/main/java/org/springframework/cloud/task/batch/configuration/TaskJobLauncherCommandLineRunnerFactoryBean.java
index f5df4c50..2459a00b 100644
--- a/spring-cloud-task-batch/src/main/java/org/springframework/cloud/task/batch/configuration/TaskJobLauncherCommandLineRunnerFactoryBean.java
+++ b/spring-cloud-task-batch/src/main/java/org/springframework/cloud/task/batch/configuration/TaskJobLauncherCommandLineRunnerFactoryBean.java
@@ -22,6 +22,7 @@ import org.springframework.batch.core.Job;
import org.springframework.batch.core.configuration.JobRegistry;
import org.springframework.batch.core.explore.JobExplorer;
import org.springframework.batch.core.launch.JobLauncher;
+import org.springframework.batch.core.repository.JobRepository;
import org.springframework.beans.factory.FactoryBean;
import org.springframework.cloud.task.batch.handler.TaskJobLauncherCommandLineRunner;
import org.springframework.util.Assert;
@@ -44,17 +45,20 @@ public class TaskJobLauncherCommandLineRunnerFactoryBean implements FactoryBean<
private JobRegistry jobRegistry;
+ private JobRepository jobRepository;
+
private Integer order = 0;
public TaskJobLauncherCommandLineRunnerFactoryBean(JobLauncher jobLauncher,
JobExplorer jobExplorer, List jobs, String jobNames,
- JobRegistry jobRegistry) {
+ JobRegistry jobRegistry, JobRepository jobRepository) {
this.jobLauncher = jobLauncher;
this.jobExplorer = jobExplorer;
Assert.notEmpty(jobs, "jobs must not be null nor empty");
this.jobs = jobs;
this.jobNames = jobNames;
this.jobRegistry = jobRegistry;
+ this.jobRepository = jobRepository;
}
public void setOrder(int order) {
@@ -64,7 +68,8 @@ public class TaskJobLauncherCommandLineRunnerFactoryBean implements FactoryBean<
@Override
public TaskJobLauncherCommandLineRunner getObject() throws Exception {
TaskJobLauncherCommandLineRunner taskJobLauncherCommandLineRunner =
- new TaskJobLauncherCommandLineRunner(this.jobLauncher, this.jobExplorer);
+ new TaskJobLauncherCommandLineRunner(this.jobLauncher,
+ this.jobExplorer, this.jobRepository);
taskJobLauncherCommandLineRunner.setJobs(this.jobs);
if(StringUtils.hasText(this.jobNames)) {
taskJobLauncherCommandLineRunner.setJobNames(this.jobNames);
diff --git a/spring-cloud-task-batch/src/main/java/org/springframework/cloud/task/batch/handler/TaskJobLauncherCommandLineRunner.java b/spring-cloud-task-batch/src/main/java/org/springframework/cloud/task/batch/handler/TaskJobLauncherCommandLineRunner.java
index fb3c54a7..55ab9794 100644
--- a/spring-cloud-task-batch/src/main/java/org/springframework/cloud/task/batch/handler/TaskJobLauncherCommandLineRunner.java
+++ b/spring-cloud-task-batch/src/main/java/org/springframework/cloud/task/batch/handler/TaskJobLauncherCommandLineRunner.java
@@ -19,17 +19,22 @@ package org.springframework.cloud.task.batch.handler;
import java.util.Arrays;
import java.util.Collection;
import java.util.Collections;
+import java.util.HashMap;
+import java.util.Map;
import java.util.Properties;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
+import org.springframework.batch.core.BatchStatus;
import org.springframework.batch.core.ExitStatus;
import org.springframework.batch.core.Job;
import org.springframework.batch.core.JobExecution;
import org.springframework.batch.core.JobExecutionException;
+import org.springframework.batch.core.JobParameter;
import org.springframework.batch.core.JobParameters;
import org.springframework.batch.core.JobParametersBuilder;
+import org.springframework.batch.core.JobParametersIncrementer;
import org.springframework.batch.core.JobParametersInvalidException;
import org.springframework.batch.core.configuration.JobRegistry;
import org.springframework.batch.core.converter.DefaultJobParametersConverter;
@@ -40,6 +45,7 @@ import org.springframework.batch.core.launch.JobParametersNotFoundException;
import org.springframework.batch.core.launch.NoSuchJobException;
import org.springframework.batch.core.repository.JobExecutionAlreadyRunningException;
import org.springframework.batch.core.repository.JobInstanceAlreadyCompleteException;
+import org.springframework.batch.core.repository.JobRepository;
import org.springframework.batch.core.repository.JobRestartException;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.CommandLineRunner;
@@ -80,6 +86,8 @@ public class TaskJobLauncherCommandLineRunner implements CommandLineRunner, Orde
private JobExplorer jobExplorer;
+ private JobRepository jobRepository;
+
private String jobNames;
private Collection jobs = Collections.emptySet();
@@ -88,10 +96,18 @@ public class TaskJobLauncherCommandLineRunner implements CommandLineRunner, Orde
private ApplicationEventPublisher publisher;
+ /**
+ * Create a new {@link TaskJobLauncherCommandLineRunner}.
+ * @param jobLauncher to launch jobs
+ * @param jobExplorer to check the job repository for previous executions
+ * @param jobRepository to check if a job instance exists with the given parameters
+ * when running a job
+ */
public TaskJobLauncherCommandLineRunner(JobLauncher jobLauncher,
- JobExplorer jobExplorer) {
+ JobExplorer jobExplorer, JobRepository jobRepository) {
this.jobLauncher = jobLauncher;
this.jobExplorer = jobExplorer;
+ this.jobRepository = jobRepository;
}
public void setOrder(int order) {
@@ -160,9 +176,39 @@ public class TaskJobLauncherCommandLineRunner implements CommandLineRunner, Orde
throws JobExecutionAlreadyRunningException, JobRestartException,
JobInstanceAlreadyCompleteException, JobParametersInvalidException,
JobParametersNotFoundException {
- JobParameters nextParameters = new JobParametersBuilder(jobParameters,
- this.jobExplorer).getNextJobParameters(job).toJobParameters();
- JobExecution execution = this.jobLauncher.run(job, nextParameters);
+ String jobName = job.getName();
+ JobParameters parameters = jobParameters;
+ boolean jobInstanceExists = this.jobRepository.isJobInstanceExists(jobName,
+ parameters);
+ if (jobInstanceExists) {
+ JobExecution lastJobExecution = this.jobRepository
+ .getLastJobExecution(jobName, jobParameters);
+ if (lastJobExecution != null && isStoppedOrFailed(lastJobExecution)
+ && job.isRestartable()) {
+ // Retry a failed or stopped execution with previous parameters
+ JobParameters previousParameters = lastJobExecution.getJobParameters();
+ /*
+ * remove Non-identifying parameters from the previous execution's
+ * parameters since there is no way to remove them programmatically. If
+ * they are required (or need to be modified) on a restart, they need to
+ * be (re)specified.
+ */
+ JobParameters previousIdentifyingParameters = removeNonIdentifying(
+ previousParameters);
+ // merge additional parameters with previous ones (overriding those with
+ // the same key)
+ parameters = merge(previousIdentifyingParameters, jobParameters);
+ }
+ }
+ else {
+ JobParametersIncrementer incrementer = job.getJobParametersIncrementer();
+ if (incrementer != null) {
+ JobParameters nextParameters = new JobParametersBuilder(jobParameters,
+ this.jobExplorer).getNextJobParameters(job).toJobParameters();
+ parameters = merge(nextParameters, jobParameters);
+ }
+ }
+ JobExecution execution = this.jobLauncher.run(job, parameters);
if (this.publisher != null) {
this.publisher.publishEvent(new JobExecutionEvent(execution));
}
@@ -189,4 +235,25 @@ public class TaskJobLauncherCommandLineRunner implements CommandLineRunner, Orde
execute(job, jobParameters);
}
}
+
+ private JobParameters removeNonIdentifying(JobParameters parameters) {
+ Map parameterMap = parameters.getParameters();
+ HashMap copy = new HashMap<>(parameterMap);
+ for (Map.Entry parameter : copy.entrySet()) {
+ if (!parameter.getValue().isIdentifying()) {
+ parameterMap.remove(parameter.getKey());
+ }
+ }
+ return new JobParameters(parameterMap);
+ }
+ private boolean isStoppedOrFailed(JobExecution execution) {
+ BatchStatus status = execution.getStatus();
+ return (status == BatchStatus.STOPPED || status == BatchStatus.FAILED);
+ }
+ private JobParameters merge(JobParameters parameters, JobParameters additionals) {
+ Map merged = new HashMap<>();
+ merged.putAll(parameters.getParameters());
+ merged.putAll(additionals.getParameters());
+ return new JobParameters(merged);
+ }
}
diff --git a/spring-cloud-task-batch/src/test/java/org/springframework/cloud/task/batch/handler/TaskJobLauncherCommandLineRunnerCoreTests.java b/spring-cloud-task-batch/src/test/java/org/springframework/cloud/task/batch/handler/TaskJobLauncherCommandLineRunnerCoreTests.java
index 38cd20a8..6abb060c 100644
--- a/spring-cloud-task-batch/src/test/java/org/springframework/cloud/task/batch/handler/TaskJobLauncherCommandLineRunnerCoreTests.java
+++ b/spring-cloud-task-batch/src/test/java/org/springframework/cloud/task/batch/handler/TaskJobLauncherCommandLineRunnerCoreTests.java
@@ -16,11 +16,15 @@
package org.springframework.cloud.task.batch.handler;
+import org.assertj.core.api.AssertionsForClassTypes;
import org.junit.Before;
import org.junit.Test;
+import org.junit.jupiter.api.function.Executable;
import org.junit.runner.RunWith;
import org.springframework.batch.core.Job;
+import org.springframework.batch.core.JobExecution;
+import org.springframework.batch.core.JobInstance;
import org.springframework.batch.core.JobParameters;
import org.springframework.batch.core.JobParametersBuilder;
import org.springframework.batch.core.Step;
@@ -34,6 +38,7 @@ import org.springframework.batch.core.launch.JobLauncher;
import org.springframework.batch.core.launch.support.RunIdIncrementer;
import org.springframework.batch.core.launch.support.SimpleJobLauncher;
import org.springframework.batch.core.repository.JobRepository;
+import org.springframework.batch.core.repository.JobRestartException;
import org.springframework.batch.core.repository.support.MapJobRepositoryFactoryBean;
import org.springframework.batch.core.step.tasklet.Tasklet;
import org.springframework.batch.support.transaction.ResourcelessTransactionManager;
@@ -47,6 +52,7 @@ import org.springframework.test.context.junit4.SpringRunner;
import org.springframework.transaction.PlatformTransactionManager;
import static org.assertj.core.api.Assertions.assertThat;
+import static org.junit.jupiter.api.Assertions.assertThrows;
/**
* @author Glenn Renfro
@@ -84,7 +90,8 @@ public class TaskJobLauncherCommandLineRunnerCoreTests {
Tasklet tasklet = (contribution, chunkContext) -> null;
this.step = this.steps.get("step").tasklet(tasklet).build();
this.job = this.jobs.get("job").start(this.step).build();
- this.runner = new TaskJobLauncherCommandLineRunner(this.jobLauncher, this.jobExplorer);
+ this.runner = new TaskJobLauncherCommandLineRunner(this.jobLauncher,
+ this.jobExplorer, this.jobRepository);
}
@@ -115,7 +122,7 @@ public class TaskJobLauncherCommandLineRunnerCoreTests {
.start(this.steps.get("step").tasklet(throwingTasklet()).build())
.incrementer(new RunIdIncrementer()).build();
runFailedJob(new JobParameters());
- runFailedJob(new JobParameters());
+ runFailedJob(new JobParametersBuilder().addLong("run.id", 1L).toJobParameters());
assertThat(this.jobExplorer.getJobInstances("job", 0, 100)).hasSize(1);
}
@@ -130,6 +137,31 @@ public class TaskJobLauncherCommandLineRunnerCoreTests {
// A failed job that is not restartable does not re-use the job params of
// the last execution, but creates a new job instance when running it again.
assertThat(this.jobExplorer.getJobInstances("job", 0, 100)).hasSize(2);
+ // try to re-run a failed execution
+ Executable executable = () -> {
+ this.runner.execute(this.job,
+ new JobParametersBuilder().addLong("run.id", 1L).toJobParameters());
+ };
+ Throwable exception = assertThrows(JobRestartException.class, executable);
+ AssertionsForClassTypes.assertThat(exception.getMessage())
+ .isEqualTo("JobInstance already exists and is not restartable");
+ }
+
+ @DirtiesContext
+ @Test
+ public void runDifferentInstances() throws Exception {
+ this.job = this.jobs.get("job")
+ .start(this.steps.get("step").tasklet(throwingTasklet()).build()).build();
+ // start a job instance
+ JobParameters jobParameters = new JobParametersBuilder().addString("name", "foo")
+ .toJobParameters();
+ runFailedJob(jobParameters);
+ assertThat(this.jobExplorer.getJobInstances("job", 0, 100)).hasSize(1);
+ // start a different job instance
+ JobParameters otherJobParameters = new JobParametersBuilder()
+ .addString("name", "bar").toJobParameters();
+ runFailedJob(otherJobParameters);
+ assertThat(this.jobExplorer.getJobInstances("job", 0, 100)).hasSize(2);
}
@DirtiesContext
@@ -140,9 +172,44 @@ public class TaskJobLauncherCommandLineRunnerCoreTests {
.incrementer(new RunIdIncrementer()).build();
JobParameters jobParameters = new JobParametersBuilder().addLong("id", 1L, false)
.addLong("foo", 2L, false).toJobParameters();
- runFailedJob(new JobParameters());
- runFailedJob(new JobParameters());
+ runFailedJob(jobParameters);
assertThat(this.jobExplorer.getJobInstances("job", 0, 100)).hasSize(1);
+ runFailedJob(new JobParametersBuilder(jobParameters)
+ .addLong("run.id", 1L).toJobParameters());
+ assertThat(this.jobExplorer.getJobInstances("job", 0, 100)).hasSize(1);
+ }
+
+ @DirtiesContext
+ @Test
+ public void retryFailedExecutionWithDifferentNonIdentifyingParametersFromPreviousExecution()
+ throws Exception {
+ this.job = this.jobs.get("job")
+ .start(this.steps.get("step").tasklet(throwingTasklet()).build())
+ .incrementer(new RunIdIncrementer()).build();
+ JobParameters jobParameters = new JobParametersBuilder().addLong("id", 1L, false)
+ .addLong("foo", 2L, false).toJobParameters();
+ runFailedJob(jobParameters);
+ assertThat(this.jobExplorer.getJobInstances("job", 0, 100)).hasSize(1);
+ // try to re-run a failed execution with non identifying parameters
+ runFailedJob( new JobParametersBuilder().addLong("run.id", 1L)
+ .addLong("id", 2L, false).addLong("foo", 3L, false).toJobParameters());
+ assertThat(this.jobExplorer.getJobInstances("job", 0, 100)).hasSize(1);
+ JobInstance jobInstance = this.jobExplorer.getJobInstance(0L);
+ assertThat(this.jobExplorer.getJobExecutions(jobInstance)).hasSize(2);
+ // first execution
+ JobExecution firstJobExecution = this.jobExplorer.getJobExecution(0L);
+ JobParameters parameters = firstJobExecution.getJobParameters();
+ assertThat(parameters.getLong("run.id")).isEqualTo(1L);
+ assertThat(parameters.getLong("id")).isEqualTo(1L);
+ assertThat(parameters.getLong("foo")).isEqualTo(2L);
+ // second execution
+ JobExecution secondJobExecution = this.jobExplorer.getJobExecution(1L);
+ parameters = secondJobExecution.getJobParameters();
+ // identifying parameters should be the same as previous execution
+ assertThat(parameters.getLong("run.id")).isEqualTo(1L);
+ // non-identifying parameters should be the newly specified ones
+ assertThat(parameters.getLong("id")).isEqualTo(2L);
+ assertThat(parameters.getLong("foo")).isEqualTo(3L);
}
private Tasklet throwingTasklet() {
@@ -154,7 +221,7 @@ public class TaskJobLauncherCommandLineRunnerCoreTests {
private void runFailedJob(JobParameters jobParameters) throws Exception {
boolean isExceptionThrown = false;
try {
- this.runner.execute(this.job, new JobParameters());
+ this.runner.execute(this.job, jobParameters);
}
catch (TaskException taskException) {
isExceptionThrown = true;
diff --git a/spring-cloud-task-batch/src/test/java/org/springframework/cloud/task/batch/handler/TaskJobLauncherCommandLineRunnerTests.java b/spring-cloud-task-batch/src/test/java/org/springframework/cloud/task/batch/handler/TaskJobLauncherCommandLineRunnerTests.java
index bedfe50a..9660acf9 100644
--- a/spring-cloud-task-batch/src/test/java/org/springframework/cloud/task/batch/handler/TaskJobLauncherCommandLineRunnerTests.java
+++ b/spring-cloud-task-batch/src/test/java/org/springframework/cloud/task/batch/handler/TaskJobLauncherCommandLineRunnerTests.java
@@ -46,6 +46,7 @@ import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.PageRequest;
+import org.springframework.test.annotation.DirtiesContext;
import static org.assertj.core.api.AssertionsForInterfaceTypes.assertThat;
@@ -63,6 +64,7 @@ public class TaskJobLauncherCommandLineRunnerTests {
}
}
+ @DirtiesContext
@Test
public void testTaskJobLauncherCLRSuccessFail() {
String[] enabledArgs = new String[] { "--spring.cloud.task.batch.failOnJobFailure=true" };
@@ -82,6 +84,7 @@ public class TaskJobLauncherCommandLineRunnerTests {
assertThat(isExceptionThrown).isTrue();
}
+ @DirtiesContext
@Test
public void testTaskJobLauncherPickOneJob() {
String[] enabledArgs = new String[] {
@@ -104,6 +107,7 @@ public class TaskJobLauncherCommandLineRunnerTests {
validateContext();
}
+ @DirtiesContext
@Test
public void testCommandLineRunnerSetToFalse() {
String[] enabledArgs = new String[] { };
diff --git a/spring-cloud-task-integration-tests/pom.xml b/spring-cloud-task-integration-tests/pom.xml
index 24202898..8162828a 100644
--- a/spring-cloud-task-integration-tests/pom.xml
+++ b/spring-cloud-task-integration-tests/pom.xml
@@ -94,6 +94,36 @@
spring-integration-jdbc
test
+
+ org.springframework.boot
+ spring-boot-test
+ ${spring-boot.version}
+
+
+ org.springframework.boot
+ spring-boot
+ ${spring-boot.version}
+
+
+ org.springframework.boot
+ spring-boot-autoconfigure
+ ${spring-boot.version}
+
+
+ org.springframework.boot
+ spring-boot-starter
+ ${spring-boot.version}
+
+
+ org.springframework.boot
+ spring-boot-starter-logging
+ ${spring-boot.version}
+
+
+ org.springframework.boot
+ spring-boot-starter-validation
+ ${spring-boot.version}
+
diff --git a/spring-cloud-task-samples/batch-events/pom.xml b/spring-cloud-task-samples/batch-events/pom.xml
index 53e77e63..569acc1c 100644
--- a/spring-cloud-task-samples/batch-events/pom.xml
+++ b/spring-cloud-task-samples/batch-events/pom.xml
@@ -13,7 +13,7 @@
org.springframework.boot
spring-boot-starter-parent
- 2.0.1.RELEASE
+ 2.0.8.RELEASE
@@ -47,19 +47,19 @@
org.springframework.cloud
spring-cloud-starter-stream-rabbit
- 2.0.0.RELEASE
+ 2.0.2.RELEASE
compile
org.springframework.cloud
spring-cloud-stream-binder-rabbit-test-support
- 2.0.0.RELEASE
+ 2.0.2.RELEASE
test
org.springframework.cloud
spring-cloud-stream-test-support-internal
- 2.0.0.RELEASE
+ 2.0.2.RELEASE
test
diff --git a/spring-cloud-task-samples/batch-job/pom.xml b/spring-cloud-task-samples/batch-job/pom.xml
index 39cc65cc..df3bd26f 100644
--- a/spring-cloud-task-samples/batch-job/pom.xml
+++ b/spring-cloud-task-samples/batch-job/pom.xml
@@ -13,7 +13,7 @@
org.springframework.boot
spring-boot-starter-parent
- 2.0.1.RELEASE
+ 2.0.8.RELEASE
diff --git a/spring-cloud-task-samples/jpa-sample/pom.xml b/spring-cloud-task-samples/jpa-sample/pom.xml
index 54aa371d..f786c787 100644
--- a/spring-cloud-task-samples/jpa-sample/pom.xml
+++ b/spring-cloud-task-samples/jpa-sample/pom.xml
@@ -27,7 +27,7 @@
org.springframework.boot
spring-boot-starter-parent
- 2.0.1.RELEASE
+ 2.0.8.RELEASE
diff --git a/spring-cloud-task-samples/multiple-datasources/pom.xml b/spring-cloud-task-samples/multiple-datasources/pom.xml
index e5ab27f2..2c7283f7 100644
--- a/spring-cloud-task-samples/multiple-datasources/pom.xml
+++ b/spring-cloud-task-samples/multiple-datasources/pom.xml
@@ -13,7 +13,7 @@
org.springframework.boot
spring-boot-starter-parent
- 2.0.1.RELEASE
+ 2.0.8.RELEASE
diff --git a/spring-cloud-task-samples/partitioned-batch-job/pom.xml b/spring-cloud-task-samples/partitioned-batch-job/pom.xml
index 317625d9..239bc87d 100644
--- a/spring-cloud-task-samples/partitioned-batch-job/pom.xml
+++ b/spring-cloud-task-samples/partitioned-batch-job/pom.xml
@@ -12,7 +12,7 @@
org.springframework.boot
spring-boot-starter-parent
- 2.0.1.RELEASE
+ 2.0.8.RELEASE
diff --git a/spring-cloud-task-samples/task-events/pom.xml b/spring-cloud-task-samples/task-events/pom.xml
index 5529cbf3..17038e34 100644
--- a/spring-cloud-task-samples/task-events/pom.xml
+++ b/spring-cloud-task-samples/task-events/pom.xml
@@ -13,7 +13,7 @@
org.springframework.boot
spring-boot-starter-parent
- 2.0.1.RELEASE
+ 2.0.8.RELEASE
@@ -43,7 +43,7 @@
org.springframework.cloud
spring-cloud-starter-stream-rabbit
- 2.0.0.RELEASE
+ 2.0.2.RELEASE
compile
diff --git a/spring-cloud-task-samples/taskprocessor/pom.xml b/spring-cloud-task-samples/taskprocessor/pom.xml
index df29d82a..f6d7ad36 100644
--- a/spring-cloud-task-samples/taskprocessor/pom.xml
+++ b/spring-cloud-task-samples/taskprocessor/pom.xml
@@ -13,7 +13,7 @@
org.springframework.boot
spring-boot-starter-parent
- 2.0.1.RELEASE
+ 2.0.8.RELEASE
@@ -42,7 +42,7 @@
org.springframework.cloud
spring-cloud-starter-stream-rabbit
- 2.0.0.RELEASE
+ 2.0.2.RELEASE
compile
@@ -52,7 +52,7 @@
org.springframework.cloud
spring-cloud-stream-test-support
- 2.0.0.RELEASE
+ 2.0.2.RELEASE
test
diff --git a/spring-cloud-task-samples/tasksink/pom.xml b/spring-cloud-task-samples/tasksink/pom.xml
index 0f966b54..6a9cc53b 100644
--- a/spring-cloud-task-samples/tasksink/pom.xml
+++ b/spring-cloud-task-samples/tasksink/pom.xml
@@ -13,7 +13,7 @@
org.springframework.boot
spring-boot-starter-parent
- 2.0.1.RELEASE
+ 2.0.8.RELEASE
@@ -48,7 +48,7 @@
org.springframework.cloud
spring-cloud-stream-test-support
- 2.0.0.RELEASE
+ 2.0.2.RELEASE
test
diff --git a/spring-cloud-task-samples/timestamp/pom.xml b/spring-cloud-task-samples/timestamp/pom.xml
index adf64e93..9b936218 100644
--- a/spring-cloud-task-samples/timestamp/pom.xml
+++ b/spring-cloud-task-samples/timestamp/pom.xml
@@ -13,7 +13,7 @@
org.springframework.boot
spring-boot-starter-parent
- 2.0.1.RELEASE
+ 2.0.8.RELEASE