diff --git a/providers/multiprovider/src/main/java/dev/openfeature/contrib/providers/multiprovider/MultiProvider.java b/providers/multiprovider/src/main/java/dev/openfeature/contrib/providers/multiprovider/MultiProvider.java index 2aefe62af..9460115ba 100644 --- a/providers/multiprovider/src/main/java/dev/openfeature/contrib/providers/multiprovider/MultiProvider.java +++ b/providers/multiprovider/src/main/java/dev/openfeature/contrib/providers/multiprovider/MultiProvider.java @@ -6,7 +6,6 @@ import dev.openfeature.sdk.Metadata; import dev.openfeature.sdk.ProviderEvaluation; import dev.openfeature.sdk.Value; -import dev.openfeature.sdk.exceptions.GeneralError; import java.util.ArrayList; import java.util.Collection; import java.util.Collections; @@ -90,7 +89,7 @@ public void initialize(EvaluationContext evaluationContext) throws Exception { json.put("name", NAME); JSONObject providersMetadata = new JSONObject(); json.put("originalMetadata", providersMetadata); - ExecutorService initPool = Executors.newFixedThreadPool(INIT_THREADS_COUNT); + Collection> tasks = new ArrayList<>(providers.size()); for (FeatureProvider provider : providers.values()) { tasks.add(() -> { @@ -101,12 +100,19 @@ public void initialize(EvaluationContext evaluationContext) throws Exception { providerMetadata.put("name", provider.getMetadata().getName()); providersMetadata.put(provider.getMetadata().getName(), providerMetadata); } - List> results = initPool.invokeAll(tasks); - for (Future result : results) { - if (!result.get()) { - throw new GeneralError("init failed"); + + ExecutorService initPool = Executors.newFixedThreadPool(INIT_THREADS_COUNT); + try { + List> results = initPool.invokeAll(tasks); + // Wait for all provider initializations to complete. + // If any provider.initialize() throws, result.get() will throw ExecutionException. + for (Future result : results) { + result.get(); } + } finally { + initPool.shutdown(); } + metadataName = json.toString(); }