From 7cc86958d6fb69060e91c9497b125a75317b37c5 Mon Sep 17 00:00:00 2001 From: Joni Lahtinen Date: Wed, 29 Nov 2023 14:59:00 +0200 Subject: [PATCH] Introduce ConcurrentExecutorHelper --- .../JiraInstanceManagerRest.groovy | 21 +++++++-------- .../ConcurrentExecutorHelper.groovy | 27 +++++++++++++++++++ 2 files changed, 37 insertions(+), 11 deletions(-) create mode 100644 src/main/groovy/com/eficode/atlassian/jiraInstanceManager/concurrent/ConcurrentExecutorHelper.groovy diff --git a/src/main/groovy/com/eficode/atlassian/jiraInstanceManager/JiraInstanceManagerRest.groovy b/src/main/groovy/com/eficode/atlassian/jiraInstanceManager/JiraInstanceManagerRest.groovy index 584ba18..f1c30ad 100644 --- a/src/main/groovy/com/eficode/atlassian/jiraInstanceManager/JiraInstanceManagerRest.groovy +++ b/src/main/groovy/com/eficode/atlassian/jiraInstanceManager/JiraInstanceManagerRest.groovy @@ -11,6 +11,7 @@ import com.eficode.atlassian.jiraInstanceManager.beans.ProjectBean import com.eficode.atlassian.jiraInstanceManager.beans.ScriptFieldBean import com.eficode.atlassian.jiraInstanceManager.beans.SpockResult import com.eficode.atlassian.jiraInstanceManager.beans.SrJob +import com.eficode.atlassian.jiraInstanceManager.concurrent.ConcurrentExecutorHelper import groovy.ant.AntBuilder import groovy.io.FileType import groovy.json.JsonSlurper @@ -35,6 +36,7 @@ import unirest.shaded.org.apache.http.conn.HttpHostConnectException import java.nio.file.StandardCopyOption + final class JiraInstanceManagerRest { static Logger log = LoggerFactory.getLogger(JiraInstanceManagerRest.class) @@ -1679,19 +1681,16 @@ final class JiraInstanceManagerRest { } } + ConcurrentExecutorHelper.executeInParallel({ state -> + directoryFiles.each { subFile -> + String destinationPath = destFilePath + srcFile.relativePath(subFile) - directoryFiles.each { subFile -> - - String destinationPath = destFilePath + srcFile.relativePath(subFile) - - destinationPath = destinationPath.startsWith("/") ? destinationPath.substring(1) : destinationPath - - log.info("\tUpdating:" + subFile.name + ", Destination: " + destinationPath) - assert updateScriptrunnerFile(subFile.text, destinationPath), "Error updating " + subFile.name - - } - + destinationPath = destinationPath.startsWith("/") ? destinationPath.substring(1) : destinationPath + log.info("\tUpdating:" + subFile.name + ", Destination: " + destinationPath) + state({-> assert updateScriptrunnerFile(subFile.text, destinationPath), "Error updating " + subFile.name}) + } + }) } else { log.info("\tUpdating:" + srcFile.name) assert updateScriptrunnerFile(srcFile.text, destFilePath), "Error updating " + srcFile.name diff --git a/src/main/groovy/com/eficode/atlassian/jiraInstanceManager/concurrent/ConcurrentExecutorHelper.groovy b/src/main/groovy/com/eficode/atlassian/jiraInstanceManager/concurrent/ConcurrentExecutorHelper.groovy new file mode 100644 index 0000000..16bd871 --- /dev/null +++ b/src/main/groovy/com/eficode/atlassian/jiraInstanceManager/concurrent/ConcurrentExecutorHelper.groovy @@ -0,0 +1,27 @@ +package com.eficode.atlassian.jiraInstanceManager.concurrent + +import java.util.concurrent.* + +public class ConcurrentExecutorHelper { + + public static List executeInParallel(Closure> closure) { + ExecutorService pool = Executors.newFixedThreadPool(10) + ExecutorCompletionService ecs = new ExecutorCompletionService(pool) + + List> futures = [] + List results = [] + try { + closure.call({ task -> + futures << ecs.submit(task) + }) + futures.each { future -> + results << future.get() + } + } finally { + pool.shutdown() + } + return results + } + + +}