This is an automated email from the ASF dual-hosted git repository.

pcongiusti pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/camel.git


The following commit(s) were added to refs/heads/main by this push:
     new 6166ae32acd8 fix(components): resilience4j default executor service
6166ae32acd8 is described below

commit 6166ae32acd86c471029334c8e755a38e2669844
Author: Pasquale Congiusti <[email protected]>
AuthorDate: Mon Jan 26 15:35:42 2026 +0100

    fix(components): resilience4j default executor service
    
    Previously the executorService was defaulted to ForkJoinPool.commonPool() 
which, above all on JDK25, is not deterministic, causing test flakiness. We are 
now creating a thread pool which is going to be used in order to make the 
implementation depends entirely on our business logic.
    
    Closes CAMEL-22906
---
 .../component/resilience4j/ResilienceProcessor.java     |  8 ++------
 .../camel/component/resilience4j/ResilienceReifier.java | 17 +++++++++++++----
 .../component/resilience4j/ResilienceTimeoutTest.java   |  3 ---
 .../resilience4j/ResilienceTimeoutThreadPoolTest.java   |  3 ---
 4 files changed, 15 insertions(+), 16 deletions(-)

diff --git 
a/components/camel-resilience4j/src/main/java/org/apache/camel/component/resilience4j/ResilienceProcessor.java
 
b/components/camel-resilience4j/src/main/java/org/apache/camel/component/resilience4j/ResilienceProcessor.java
index 8b8a72b9f54f..6c111e592960 100644
--- 
a/components/camel-resilience4j/src/main/java/org/apache/camel/component/resilience4j/ResilienceProcessor.java
+++ 
b/components/camel-resilience4j/src/main/java/org/apache/camel/component/resilience4j/ResilienceProcessor.java
@@ -516,12 +516,8 @@ public class ResilienceProcessor extends 
BaseProcessorSupport
             Callable<Exchange> callable;
 
             if (timeLimiter != null) {
-                Supplier<CompletableFuture<Exchange>> futureSupplier;
-                if (executorService == null) {
-                    futureSupplier = () -> 
CompletableFuture.supplyAsync(ftask);
-                } else {
-                    futureSupplier = () -> 
CompletableFuture.supplyAsync(ftask, executorService);
-                }
+                Supplier<CompletableFuture<Exchange>> futureSupplier
+                        = () -> CompletableFuture.supplyAsync(ftask, 
executorService);
                 callable = TimeLimiter.decorateFutureSupplier(timeLimiter, 
futureSupplier);
             } else {
                 callable = task;
diff --git 
a/components/camel-resilience4j/src/main/java/org/apache/camel/component/resilience4j/ResilienceReifier.java
 
b/components/camel-resilience4j/src/main/java/org/apache/camel/component/resilience4j/ResilienceReifier.java
index 8411a707bfba..d0f386e95ae2 100644
--- 
a/components/camel-resilience4j/src/main/java/org/apache/camel/component/resilience4j/ResilienceReifier.java
+++ 
b/components/camel-resilience4j/src/main/java/org/apache/camel/component/resilience4j/ResilienceReifier.java
@@ -212,17 +212,26 @@ public class ResilienceReifier extends 
ProcessorReifier<CircuitBreakerDefinition
             return;
         }
 
+        ExecutorService executorService;
+        boolean shutdownThreadPool = false;
+
         if (config.getTimeoutExecutorService() != null) {
             String ref = config.getTimeoutExecutorService();
-            boolean shutdownThreadPool = false;
-            ExecutorService executorService = lookupByNameAndType(ref, 
ExecutorService.class);
+            executorService = lookupByNameAndType(ref, ExecutorService.class);
             if (executorService == null) {
                 executorService = lookupExecutorServiceRef("CircuitBreaker", 
definition, ref);
                 shutdownThreadPool = true;
             }
-            processor.setExecutorService(executorService);
-            processor.setShutdownExecutorService(shutdownThreadPool);
+        } else {
+            // A default thread pool if none is provided.
+            executorService = camelContext.getExecutorServiceManager()
+                    .newThreadPool(this, "CircuitBreaker",
+                            
camelContext.getExecutorServiceManager().getDefaultThreadPoolProfile());
+            shutdownThreadPool = true;
         }
+
+        processor.setExecutorService(executorService);
+        processor.setShutdownExecutorService(shutdownThreadPool);
     }
 
     // *******************************
diff --git 
a/components/camel-resilience4j/src/test/java/org/apache/camel/component/resilience4j/ResilienceTimeoutTest.java
 
b/components/camel-resilience4j/src/test/java/org/apache/camel/component/resilience4j/ResilienceTimeoutTest.java
index 9d02eb18f889..93088b5f3449 100644
--- 
a/components/camel-resilience4j/src/test/java/org/apache/camel/component/resilience4j/ResilienceTimeoutTest.java
+++ 
b/components/camel-resilience4j/src/test/java/org/apache/camel/component/resilience4j/ResilienceTimeoutTest.java
@@ -21,7 +21,6 @@ import java.util.concurrent.TimeoutException;
 import org.apache.camel.RoutesBuilder;
 import org.apache.camel.builder.RouteBuilder;
 import org.apache.camel.test.junit5.CamelTestSupport;
-import org.junit.jupiter.api.Disabled;
 import org.junit.jupiter.api.Test;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
@@ -55,12 +54,10 @@ public class ResilienceTimeoutTest extends CamelTestSupport 
{
     }
 
     @Test
-    @Disabled("manual testing")
     public void testSlowLoop() {
         // this calls the slow route and therefore causes a timeout which
         // triggers an exception
         for (int i = 0; i < 10; i++) {
-            log.info(">>> test run {} <<<", i);
             Exception exception = assertThrows(Exception.class,
                     () -> template.requestBody("direct:start", "slow"),
                     "Should fail due to timeout");
diff --git 
a/components/camel-resilience4j/src/test/java/org/apache/camel/component/resilience4j/ResilienceTimeoutThreadPoolTest.java
 
b/components/camel-resilience4j/src/test/java/org/apache/camel/component/resilience4j/ResilienceTimeoutThreadPoolTest.java
index 77bfd4f7a42c..b86fe012799f 100644
--- 
a/components/camel-resilience4j/src/test/java/org/apache/camel/component/resilience4j/ResilienceTimeoutThreadPoolTest.java
+++ 
b/components/camel-resilience4j/src/test/java/org/apache/camel/component/resilience4j/ResilienceTimeoutThreadPoolTest.java
@@ -24,7 +24,6 @@ import org.apache.camel.BindToRegistry;
 import org.apache.camel.RoutesBuilder;
 import org.apache.camel.builder.RouteBuilder;
 import org.apache.camel.test.junit5.CamelTestSupport;
-import org.junit.jupiter.api.Disabled;
 import org.junit.jupiter.api.Test;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
@@ -84,12 +83,10 @@ public class ResilienceTimeoutThreadPoolTest extends 
CamelTestSupport {
     }
 
     @Test
-    @Disabled("manual testing")
     public void testSlowLoop() {
         // this calls the slow route and therefore causes a timeout which
         // triggers an exception
         for (int i = 0; i < 10; i++) {
-            log.info(">>> test run {} <<<", i);
             Exception exception = assertThrows(Exception.class,
                     () -> template.requestBody("direct:start", "slow"),
                     "Should fail due to timeout");

Reply via email to