This is an automated email from the ASF dual-hosted git repository.
daim pushed a commit to branch trunk
in repository https://gitbox.apache.org/repos/asf/jackrabbit-oak.git
The following commit(s) were added to refs/heads/trunk by this push:
new 2d94c5c45b OAK-11917 : added exiting scheduled executor service in
oak-commons (#2623)
2d94c5c45b is described below
commit 2d94c5c45b5bb762ff259dd6b3b6914860610415
Author: Rishabh Kumar <[email protected]>
AuthorDate: Tue Nov 25 13:34:45 2025 +0530
OAK-11917 : added exiting scheduled executor service in oak-commons (#2623)
---
.../commons/internal/concurrent/ExecutorUtils.java | 11 +++++++++
.../internal/concurrent/ExecutorUtilsTest.java | 26 ++++++++++++++++++++++
2 files changed, 37 insertions(+)
diff --git
a/oak-commons/src/main/java/org/apache/jackrabbit/oak/commons/internal/concurrent/ExecutorUtils.java
b/oak-commons/src/main/java/org/apache/jackrabbit/oak/commons/internal/concurrent/ExecutorUtils.java
index 9abfde3393..1962c494a0 100644
---
a/oak-commons/src/main/java/org/apache/jackrabbit/oak/commons/internal/concurrent/ExecutorUtils.java
+++
b/oak-commons/src/main/java/org/apache/jackrabbit/oak/commons/internal/concurrent/ExecutorUtils.java
@@ -25,6 +25,8 @@ import
org.apache.jackrabbit.guava.common.util.concurrent.ThreadFactoryBuilder;
import org.apache.jackrabbit.oak.commons.concurrent.ExecutorCloser;
import java.util.concurrent.Executors;
+import java.util.concurrent.ScheduledExecutorService;
+import java.util.concurrent.ScheduledThreadPoolExecutor;
import java.util.concurrent.ThreadPoolExecutor;
import java.util.concurrent.TimeUnit;
@@ -53,6 +55,15 @@ public class ExecutorUtils {
}
+ public static ScheduledExecutorService
getExitingScheduledExecutorService(ScheduledThreadPoolExecutor executor) {
+ setDeamonThreadFactory(executor);
+ ScheduledExecutorService service =
Executors.unconfigurableScheduledExecutorService(executor);
+ // JVM shutdown hook for graceful executor shutdown
+ addRuntimeShutdownHook(executor);
+ return service;
+
+ }
+
private static void addRuntimeShutdownHook(final ExecutorService executor)
{
Runtime.getRuntime().addShutdownHook(
new Thread(() -> new ExecutorCloser(executor, 120,
TimeUnit.SECONDS).close(),
diff --git
a/oak-commons/src/test/java/org/apache/jackrabbit/oak/commons/internal/concurrent/ExecutorUtilsTest.java
b/oak-commons/src/test/java/org/apache/jackrabbit/oak/commons/internal/concurrent/ExecutorUtilsTest.java
index d7d55465a9..6ac440975f 100644
---
a/oak-commons/src/test/java/org/apache/jackrabbit/oak/commons/internal/concurrent/ExecutorUtilsTest.java
+++
b/oak-commons/src/test/java/org/apache/jackrabbit/oak/commons/internal/concurrent/ExecutorUtilsTest.java
@@ -25,6 +25,7 @@ import java.util.concurrent.Executor;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.Future;
+import java.util.concurrent.ScheduledThreadPoolExecutor;
import java.util.concurrent.ThreadPoolExecutor;
import java.util.concurrent.TimeUnit;
@@ -100,4 +101,29 @@ public class ExecutorUtilsTest {
Assert.assertTrue(terminated || executor.isShutdown());
}
+ @Test
+ public void
testGetScheduledExitingExecutorServiceReturnsUnconfigurableExecutor() {
+ ScheduledThreadPoolExecutor executor = (ScheduledThreadPoolExecutor)
Executors.newScheduledThreadPool(1);
+ ExecutorService service =
ExecutorUtils.getExitingScheduledExecutorService(executor);
+ Assert.assertNotNull(service);
+
Assert.assertFalse(service.getClass().getName().contains("ThreadPoolExecutor"));
+ }
+
+ @Test
+ public void testScheduledExecutorDaemonThreadFactoryIsSet() {
+ ScheduledThreadPoolExecutor executor = (ScheduledThreadPoolExecutor)
Executors.newScheduledThreadPool(1);
+ ExecutorUtils.getExitingScheduledExecutorService(executor);
+ Assert.assertTrue(executor.getThreadFactory().newThread(() ->
{}).isDaemon());
+ }
+
+ @Test
+ public void
testScheduledExecutorShutdownHookIsRegisteredAndShutsDownExecutor() throws
Exception {
+ ScheduledThreadPoolExecutor executor = (ScheduledThreadPoolExecutor)
Executors.newScheduledThreadPool(1);
+ ExecutorUtils.getExitingScheduledExecutorService(executor);
+ // Simulate JVM shutdown hook
+ executor.shutdown();
+ boolean terminated = executor.awaitTermination(1, TimeUnit.SECONDS);
+ Assert.assertTrue(terminated || executor.isShutdown());
+ }
+
}
\ No newline at end of file