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 4a4c822274
commit e329b61d18
2 changed files with 42 additions and 6 deletions

View File

@@ -71,6 +71,7 @@ import org.springframework.util.Assert;
* @author Mahmoud Ben Hassine
* @author Dimitrios Liapis
* @author Philippe Marschall
* @author Jinwoo Bae
*/
public class JdbcJobExecutionDao extends AbstractJdbcBatchMetadataDao implements JobExecutionDao, InitializingBean {
@@ -492,8 +493,6 @@ public class JdbcJobExecutionDao extends AbstractJdbcBatchMetadataDao implements
private JobInstance jobInstance;
private JobParameters jobParameters;
public JobExecutionRowMapper() {
}
@@ -505,9 +504,7 @@ public class JdbcJobExecutionDao extends AbstractJdbcBatchMetadataDao implements
public JobExecution mapRow(ResultSet rs, int rowNum) throws SQLException {
Long id = rs.getLong(1);
JobExecution jobExecution;
if (jobParameters == null) {
jobParameters = getJobParameters(id);
}
JobParameters jobParameters = getJobParameters(id);
if (jobInstance == null) {
jobExecution = new JobExecution(id, jobParameters);

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.
@@ -40,6 +40,7 @@ import org.springframework.batch.core.JobExecutionListener;
import org.springframework.batch.core.JobInstance;
import org.springframework.batch.core.JobInterruptedException;
import org.springframework.batch.core.JobParameters;
import org.springframework.batch.core.JobParametersBuilder;
import org.springframework.batch.core.Step;
import org.springframework.batch.core.StepExecution;
import org.springframework.batch.core.UnexpectedJobExecutionException;
@@ -68,6 +69,7 @@ import static org.mockito.Mockito.mock;
* @author Lucas Ward
* @author Will Schipp
* @author Mahmoud Ben Hassine
* @author Jinwoo Bae
*/
class SimpleJobTests {
@@ -483,6 +485,43 @@ class SimpleJobTests {
assertNull(step);
}
@Test
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.
*/