Задача 1
Вас укусил способ, которым Groovy замыкает переменные, находящиеся вне их области видимости. Ссылки на script
внутри замыкания получат значение script
в момент запуска замыкания, которое будет последним значением из script
. Таким образом, оба замыкания фактически загружают "B. groovy" , и исключение никогда не генерируется!
Исправление простое, просто создайте локальную переменную внутри l oop, которая захватывает текущее значение script
:
for( script in scripts ) {
def theScript = script
// Now only use theScript inside of the closure!
}
Задача 2
Вы не сериализуете права записи в переменную status
из потоков parallel
. Это может привести к очень неприятным, трудно воспроизводимым ошибкам.
Исправление заключается в использовании Map.asSynchronized()
для создания синхронизированной карты :
status = [:].asSynchronized()
Завершить 'main. groovy' fix
m = [:]
status = [:].asSynchronized() // because multiple threads write to this variable
scripts = ["A", "B"]
for( script in scripts ) {
def theScript = script // Important to pass the current value into the closure!
m[ theScript ] = {
stage( theScript ) {
try {
load "${theScript}.groovy"
status[ theScript ] = true
}
catch (Exception e) {
status[ theScript ] = false
}
}
}
}
parallel m
for( result_iterator in status ) {
print "${result_iterator.key} resulted in ${result_iterator.value}"
}
Примечание: Я также удалил ненужные строковые интерполяции.