Fix retrieval of job parameters in SimpleJobExplorer#getJobExecutions

Before this commit, SimpleJobExplorer#getJobExecutions returned
job executions with wrong job parameters, ie a job execution could
have the parameter of another execution.

This commit fixes the implementation so that each returned job
execution has its own parameters.

Resolves #4246
This commit is contained in:
jinwoo-Bae
2023-05-02 20:14:08 +09:00
committed by Mahmoud Ben Hassine
parent 9874a6502c
commit 539ec71ed7
2 changed files with 48 additions and 7 deletions

View File

@@ -1,5 +1,5 @@
/*
* Copyright 2006-2022 the original author or authors.
* Copyright 2006-2023 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.
@@ -61,6 +61,7 @@ import org.springframework.util.Assert;
* @author Michael Minella
* @author Mahmoud Ben Hassine
* @author Dimitrios Liapis
* @author Jinwoo Bae
*/
public class JdbcJobExecutionDao extends AbstractJdbcBatchMetadataDao implements JobExecutionDao, InitializingBean {
@@ -403,8 +404,6 @@ public class JdbcJobExecutionDao extends AbstractJdbcBatchMetadataDao implements
private JobInstance jobInstance;
private JobParameters jobParameters;
public JobExecutionRowMapper() {
}
@@ -417,9 +416,7 @@ public class JdbcJobExecutionDao extends AbstractJdbcBatchMetadataDao implements
Long id = rs.getLong(1);
String jobConfigurationLocation = rs.getString(10);
JobExecution jobExecution;
if (jobParameters == null) {
jobParameters = getJobParameters(id);
}
JobParameters jobParameters = getJobParameters(id);
if (jobInstance == null) {
jobExecution = new JobExecution(id, jobParameters, jobConfigurationLocation);

View File

@@ -1,5 +1,5 @@
/*
* Copyright 2006-2019 the original author or authors.
* Copyright 2006-2023 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.
@@ -45,6 +45,8 @@ import org.springframework.batch.core.JobParametersBuilder;
import org.springframework.batch.core.Step;
import org.springframework.batch.core.StepExecution;
import org.springframework.batch.core.UnexpectedJobExecutionException;
import org.springframework.batch.core.explore.JobExplorer;
import org.springframework.batch.core.explore.support.SimpleJobExplorer;
import org.springframework.batch.core.listener.JobExecutionListenerSupport;
import org.springframework.batch.core.repository.JobRepository;
import org.springframework.batch.core.repository.dao.ExecutionContextDao;
@@ -66,11 +68,14 @@ import org.springframework.batch.item.ExecutionContext;
* @author Lucas Ward
* @author Will Schipp
* @author Mahmoud Ben Hassine
* @author Jinwoo Bae
*/
public class SimpleJobTests {
private JobRepository jobRepository;
private JobExplorer jobExplorer;
private JobInstanceDao jobInstanceDao;
private JobExecutionDao jobExecutionDao;
@@ -105,9 +110,11 @@ public class SimpleJobTests {
stepExecutionDao = new MapStepExecutionDao();
ecDao = new MapExecutionContextDao();
jobRepository = new SimpleJobRepository(jobInstanceDao, jobExecutionDao, stepExecutionDao, ecDao);
jobExplorer = new SimpleJobExplorer(jobInstanceDao, jobExecutionDao, stepExecutionDao, ecDao);
job = new SimpleJob();
job.setJobRepository(jobRepository);
step1 = new StubStep("TestStep1", jobRepository);
step1.setCallback(new Runnable() {
@Override
@@ -524,6 +531,43 @@ public class SimpleJobTests {
assertNull(step);
}
@Test
public void testGetMultipleJobParameters() throws Exception {
StubStep failStep = new StubStep("failStep", jobRepository);
failStep.setCallback(new Runnable() {
@Override
public void run() {
throw new RuntimeException("An error occurred.");
}
});
job.setName("parametersTestJob");
job.setSteps(Arrays.asList(new Step[] { failStep }));
JobParameters firstJobParameters = new JobParametersBuilder().addString("JobExecutionParameter", "first", false)
.toJobParameters();
JobExecution jobexecution = jobRepository.createJobExecution(job.getName(), firstJobParameters);
job.execute(jobexecution);
List<JobExecution> jobExecutionList = jobExplorer.getJobExecutions(jobexecution.getJobInstance());
assertEquals(jobExecutionList.size(), 1);
assertEquals(jobExecutionList.get(0).getJobParameters().getString("JobExecutionParameter"), "first");
JobParameters secondJobParameters = new JobParametersBuilder()
.addString("JobExecutionParameter", "second", false).toJobParameters();
jobexecution = jobRepository.createJobExecution(job.getName(), secondJobParameters);
job.execute(jobexecution);
jobExecutionList = jobExplorer.getJobExecutions(jobexecution.getJobInstance());
assertEquals(jobExecutionList.size(), 2);
assertEquals(jobExecutionList.get(0).getJobParameters().getString("JobExecutionParameter"), "second");
assertEquals(jobExecutionList.get(1).getJobParameters().getString("JobExecutionParameter"), "first");
}
/*
* Check JobRepository to ensure status is being saved.
*/