diff --git a/spring-batch-core/src/main/java/org/springframework/batch/core/converter/DefaultJobParametersConverter.java b/spring-batch-core/src/main/java/org/springframework/batch/core/converter/DefaultJobParametersConverter.java index 995c64ef3..91230d117 100644 --- a/spring-batch-core/src/main/java/org/springframework/batch/core/converter/DefaultJobParametersConverter.java +++ b/spring-batch-core/src/main/java/org/springframework/batch/core/converter/DefaultJobParametersConverter.java @@ -51,7 +51,7 @@ import org.springframework.util.StringUtils; * strategies, augmented if necessary by the custom editors provided. * *
- * + * * If you need to be able to parse and format local-specific dates and numbers, * you can inject formatters ({@link #setDateFormat(DateFormat)} and * {@link #setNumberFormat(NumberFormat)}). @@ -114,13 +114,15 @@ public class DefaultJobParametersConverter implements JobParametersConverter { if (key.endsWith(DATE_TYPE)) { Date date; - try { - date = dateFormat.parse(value); - } - catch (ParseException ex) { - String suffix = (dateFormat instanceof SimpleDateFormat) ? ", use " - + ((SimpleDateFormat) dateFormat).toPattern() : ""; - throw new IllegalArgumentException("Date format is invalid: [" + value + "]" + suffix); + synchronized (dateFormat) { + try { + date = dateFormat.parse(value); + } + catch (ParseException ex) { + String suffix = (dateFormat instanceof SimpleDateFormat) ? ", use " + + ((SimpleDateFormat) dateFormat).toPattern() : ""; + throw new IllegalArgumentException("Date format is invalid: [" + value + "]" + suffix); + } } propertiesBuilder.addDate(StringUtils.replace(key, DATE_TYPE, ""), date, identifying); } @@ -164,13 +166,15 @@ public class DefaultJobParametersConverter implements JobParametersConverter { * Delegate to {@link NumberFormat} to parse the value */ private Number parseNumber(String value) { - try { - return numberFormat.parse(value); - } - catch (ParseException ex) { - String suffix = (numberFormat instanceof DecimalFormat) ? ", use " - + ((DecimalFormat) numberFormat).toPattern() : ""; - throw new IllegalArgumentException("Number format is invalid: [" + value + "], use " + suffix); + synchronized (numberFormat) { + try { + return numberFormat.parse(value); + } + catch (ParseException ex) { + String suffix = (numberFormat instanceof DecimalFormat) ? ", use " + + ((DecimalFormat) numberFormat).toPattern() : ""; + throw new IllegalArgumentException("Number format is invalid: [" + value + "], use " + suffix); + } } } @@ -196,10 +200,14 @@ public class DefaultJobParametersConverter implements JobParametersConverter { Object value = jobParameter.getValue(); if (value != null) { if (jobParameter.getType() == ParameterType.DATE) { - result.setProperty(key + DATE_TYPE, dateFormat.format(value)); + synchronized (dateFormat) { + result.setProperty(key + DATE_TYPE, dateFormat.format(value)); + } } else if (jobParameter.getType() == ParameterType.LONG) { - result.setProperty(key + LONG_TYPE, longNumberFormat.format(value)); + synchronized (longNumberFormat) { + result.setProperty(key + LONG_TYPE, longNumberFormat.format(value)); + } } else if (jobParameter.getType() == ParameterType.DOUBLE) { result.setProperty(key + DOUBLE_TYPE, decimalFormat((Double)value)); @@ -218,7 +226,9 @@ public class DefaultJobParametersConverter implements JobParametersConverter { */ private String decimalFormat(double value) { if (numberFormat != DEFAULT_NUMBER_FORMAT) { - return numberFormat.format(value); + synchronized (numberFormat) { + return numberFormat.format(value); + } } return Double.toString(value); }