1616package org .springframework .batch .test ;
1717
1818import java .util .Collection ;
19+ import java .util .concurrent .atomic .AtomicLong ;
1920
2021import org .springframework .batch .core .job .JobExecution ;
2122import org .springframework .batch .core .job .JobInstance ;
@@ -58,6 +59,16 @@ public class MetaDataInstanceFactory {
5859 */
5960 public static final long DEFAULT_STEP_EXECUTION_ID = 1234L ;
6061
62+ /**
63+ * Atomic counter for generating unique job execution IDs in tests
64+ */
65+ private static final AtomicLong jobExecutionIdCounter = new AtomicLong (DEFAULT_JOB_EXECUTION_ID );
66+
67+ /**
68+ * Atomic counter for generating unique step execution IDs in tests
69+ */
70+ private static final AtomicLong stepExecutionIdCounter = new AtomicLong (DEFAULT_STEP_EXECUTION_ID );
71+
6172 /**
6273 * Create a {@link JobInstance} with the parameters provided.
6374 * @param jobName the name of the job
@@ -114,7 +125,7 @@ public static JobExecution createJobExecution(String jobName, Long instanceId, L
114125 * @return a {@link JobExecution}
115126 */
116127 public static JobExecution createJobExecution (String jobName , Long instanceId , Long executionId ,
117- JobParameters jobParameters ) {
128+ JobParameters jobParameters ) {
118129 return new JobExecution (executionId , createJobInstance (jobName , instanceId ), jobParameters );
119130 }
120131
@@ -170,6 +181,8 @@ public static JobExecution createJobExecutionWithStepExecutions(Long executionId
170181 /**
171182 * Create a {@link StepExecution} and all its parent entities with default values, but
172183 * using the {@link ExecutionContext} and {@link JobParameters} provided.
184+ * Each invocation generates unique IDs to avoid collision in
185+ * {@link org.springframework.batch.core.scope.context.StepSynchronizationManager}.
173186 * @param jobParameters come {@link JobParameters}
174187 * @param executionContext some {@link ExecutionContext}
175188 * @return a {@link StepExecution} with the execution context provided
@@ -183,13 +196,17 @@ public static StepExecution createStepExecution(JobParameters jobParameters, Exe
183196 /**
184197 * Create a {@link StepExecution} and all its parent entities with default values, but
185198 * using the {@link JobParameters} provided.
199+ * Each invocation generates unique IDs to avoid collision in
200+ * {@link org.springframework.batch.core.scope.context.StepSynchronizationManager}.
186201 * @param jobParameters some {@link JobParameters}
187202 * @return a {@link StepExecution} with the job parameters provided
188203 */
189204 public static StepExecution createStepExecution (JobParameters jobParameters ) {
190- JobExecution jobExecution = createJobExecution (DEFAULT_JOB_NAME , DEFAULT_JOB_INSTANCE_ID ,
191- DEFAULT_JOB_EXECUTION_ID , jobParameters );
192- StepExecution stepExecution = createStepExecution (jobExecution , DEFAULT_STEP_NAME , DEFAULT_STEP_EXECUTION_ID );
205+ Long jobExecutionId = jobExecutionIdCounter .incrementAndGet ();
206+ Long stepExecutionId = stepExecutionIdCounter .incrementAndGet ();
207+ JobExecution jobExecution = createJobExecution (DEFAULT_JOB_NAME , DEFAULT_JOB_INSTANCE_ID , jobExecutionId ,
208+ jobParameters );
209+ StepExecution stepExecution = createStepExecution (jobExecution , DEFAULT_STEP_NAME , stepExecutionId );
193210 jobExecution .addStepExecution (stepExecution );
194211 return stepExecution ;
195212 }
0 commit comments