From 38520ea68c5f8f9a21d18b5100710e4a947e7aa7 Mon Sep 17 00:00:00 2001 From: dsyer Date: Sat, 8 Nov 2008 18:08:47 +0000 Subject: [PATCH] RESOLVED - issue BATCH-912: Thread safety issue in JobRegistryBackgroundJobRunner Fixed --- .../JobRegistryBackgroundJobRunner.java | 19 +++++++++++++------ 1 file changed, 13 insertions(+), 6 deletions(-) diff --git a/spring-batch-core/src/main/java/org/springframework/batch/core/launch/support/JobRegistryBackgroundJobRunner.java b/spring-batch-core/src/main/java/org/springframework/batch/core/launch/support/JobRegistryBackgroundJobRunner.java index 4f52d3018..cc466a38a 100644 --- a/spring-batch-core/src/main/java/org/springframework/batch/core/launch/support/JobRegistryBackgroundJobRunner.java +++ b/spring-batch-core/src/main/java/org/springframework/batch/core/launch/support/JobRegistryBackgroundJobRunner.java @@ -18,6 +18,7 @@ package org.springframework.batch.core.launch.support; import java.io.IOException; import java.util.ArrayList; import java.util.Arrays; +import java.util.Collections; import java.util.List; import org.apache.commons.logging.Log; @@ -79,7 +80,7 @@ public class JobRegistryBackgroundJobRunner { final private String parentContextPath; - private static List errors = new ArrayList(); + private static List errors = Collections.synchronizedList(new ArrayList()); /** * @param parentContextPath @@ -103,7 +104,9 @@ public class JobRegistryBackgroundJobRunner { * @return the errors */ public static List getErrors() { - return errors; + synchronized (errors) { + return new ArrayList(errors); + } } private void register(String[] paths) throws DuplicateJobException, IOException { @@ -183,11 +186,15 @@ public class JobRegistryBackgroundJobRunner { while (launcher.parentContext == null && errors.isEmpty()) { Thread.sleep(100L); } - if (!errors.isEmpty()) { - logger.info(errors.size() + " errors detected on startup of parent context. Rethrowing."); - throw errors.get(0); - } + synchronized (errors) { + if (!errors.isEmpty()) { + logger.info(errors.size() + " errors detected on startup of parent context. Rethrowing."); + throw errors.get(0); + } + } + errors.clear(); + // Paths to individual job configurations. final String[] paths = new String[args.length - 1]; System.arraycopy(args, 1, paths, 0, paths.length);