diff --git a/src/main/java/com/alibaba/ttl/threadpool/ExecutorServiceTtlWrapper.java b/src/main/java/com/alibaba/ttl/threadpool/ExecutorServiceTtlWrapper.java index 476acaf161efef1b2744ada8b03adc762571d6f9..881adb62ed14fefb40c5951c4213218c465cafd1 100644 --- a/src/main/java/com/alibaba/ttl/threadpool/ExecutorServiceTtlWrapper.java +++ b/src/main/java/com/alibaba/ttl/threadpool/ExecutorServiceTtlWrapper.java @@ -83,4 +83,9 @@ class ExecutorServiceTtlWrapper extends ExecutorTtlWrapper implements ExecutorSe public T invokeAny(Collection> tasks, long timeout, TimeUnit unit) throws InterruptedException, ExecutionException, TimeoutException { return executorService.invokeAny(TtlCallable.gets(tasks), timeout, unit); } + + @Override + public ExecutorService unwrap() { + return executorService; + } } diff --git a/src/main/java/com/alibaba/ttl/threadpool/ExecutorTtlWrapper.java b/src/main/java/com/alibaba/ttl/threadpool/ExecutorTtlWrapper.java index 85fe77dd6551800c300ff251867640f9fa321770..d926925c686aec616bc2c8717e5d256e6b197591 100644 --- a/src/main/java/com/alibaba/ttl/threadpool/ExecutorTtlWrapper.java +++ b/src/main/java/com/alibaba/ttl/threadpool/ExecutorTtlWrapper.java @@ -24,4 +24,8 @@ class ExecutorTtlWrapper implements Executor { public void execute(Runnable command) { executor.execute(TtlRunnable.get(command)); } + + public Executor unwrap() { + return executor; + } } diff --git a/src/main/java/com/alibaba/ttl/threadpool/ScheduledExecutorServiceTtlWrapper.java b/src/main/java/com/alibaba/ttl/threadpool/ScheduledExecutorServiceTtlWrapper.java index 547ea819432d7c11d044d42e7a3ec6c867f83d90..6c2641ca74bade7a6d1376f8e7f5ad98a00631a3 100644 --- a/src/main/java/com/alibaba/ttl/threadpool/ScheduledExecutorServiceTtlWrapper.java +++ b/src/main/java/com/alibaba/ttl/threadpool/ScheduledExecutorServiceTtlWrapper.java @@ -4,10 +4,7 @@ import com.alibaba.ttl.TransmittableThreadLocal; import com.alibaba.ttl.TtlCallable; import com.alibaba.ttl.TtlRunnable; -import java.util.concurrent.Callable; -import java.util.concurrent.ScheduledExecutorService; -import java.util.concurrent.ScheduledFuture; -import java.util.concurrent.TimeUnit; +import java.util.concurrent.*; /** * {@link TransmittableThreadLocal} Wrapper of {@link ScheduledExecutorService}, @@ -44,4 +41,9 @@ class ScheduledExecutorServiceTtlWrapper extends ExecutorServiceTtlWrapper imple public ScheduledFuture scheduleWithFixedDelay(Runnable command, long initialDelay, long delay, TimeUnit unit) { return scheduledExecutorService.scheduleWithFixedDelay(TtlRunnable.get(command), initialDelay, delay, unit); } + + @Override + public ScheduledExecutorService unwrap() { + return scheduledExecutorService; + } } diff --git a/src/main/java/com/alibaba/ttl/threadpool/TtlExecutors.java b/src/main/java/com/alibaba/ttl/threadpool/TtlExecutors.java index 989a1908cba3faf526395d99bc2e57e69a9e3d9e..d82b689c8c27879dbb17cec3d77613903badabc8 100644 --- a/src/main/java/com/alibaba/ttl/threadpool/TtlExecutors.java +++ b/src/main/java/com/alibaba/ttl/threadpool/TtlExecutors.java @@ -7,7 +7,7 @@ import java.util.concurrent.ExecutorService; import java.util.concurrent.ScheduledExecutorService; /** - * Factory Utils for getting TTL Wrapper of jdk executors. + * Factory Utils for getting TTL wrapper of jdk executors. * * @author Jerry Lee (oldratlee at gmail dot com) * @see java.util.concurrent.Executor @@ -56,6 +56,48 @@ public final class TtlExecutors { return new ScheduledExecutorServiceTtlWrapper(scheduledExecutorService); } + /** + * check the executor is TTL wrapper executor or not. + *

+ * if the parameter executor is TTL wrapper, return {@code true}, otherwise {@code false}. + *

+ * NOTE: if input executor is {@code null}, return {@code false}. + * + * @param executor input executor + * @param Executor type + * @see #getTtlExecutor(Executor) + * @see #getTtlExecutorService(ExecutorService) + * @see #getTtlScheduledExecutorService(ScheduledExecutorService) + * @see #unwrap(Executor) + * @since 2.8.0 + */ + public static boolean isTtlWrapper(T executor) { + return (executor instanceof ExecutorTtlWrapper); + } + + /** + * Unwrap TTL wrapper executor to the original/underneath one. + *

+ * if the parameter executor is TTL wrapper, return the original/underneath executor; + * otherwise, just return the input parameter executor. + *

+ * NOTE: if input executor is {@code null}, return {@code null}. + * + * @param executor input executor + * @param Executor type + * @see #getTtlExecutor(Executor) + * @see #getTtlExecutorService(ExecutorService) + * @see #getTtlScheduledExecutorService(ScheduledExecutorService) + * @see #isTtlWrapper(Executor) + * @since 2.8.0 + */ + @SuppressWarnings("unchecked") + public static T unwrap(T executor) { + if (!isTtlWrapper(executor)) return executor; + + return (T) ((ExecutorTtlWrapper) executor).unwrap(); + } + private TtlExecutors() { } } diff --git a/src/main/java/com/alibaba/ttl/threadpool/agent/TtlAgent.java b/src/main/java/com/alibaba/ttl/threadpool/agent/TtlAgent.java index 18fc4387c77194c4becf1e202665b1c91e29da97..7ce14d812e5b34732f2b15b89b655801c79ca2c5 100644 --- a/src/main/java/com/alibaba/ttl/threadpool/agent/TtlAgent.java +++ b/src/main/java/com/alibaba/ttl/threadpool/agent/TtlAgent.java @@ -9,7 +9,10 @@ import com.alibaba.ttl.threadpool.agent.internal.transformlet.impl.TtlTimerTaskT import java.lang.instrument.ClassFileTransformer; import java.lang.instrument.Instrumentation; -import java.util.*; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; import java.util.logging.Level; /** diff --git a/src/main/java/com/alibaba/ttl/threadpool/agent/internal/transformlet/JavassistTransformlet.java b/src/main/java/com/alibaba/ttl/threadpool/agent/internal/transformlet/JavassistTransformlet.java index e68f687932546b3eccd46f81e97310304271649f..ae280aabcf951ebebe185eda714473e41126b8b7 100644 --- a/src/main/java/com/alibaba/ttl/threadpool/agent/internal/transformlet/JavassistTransformlet.java +++ b/src/main/java/com/alibaba/ttl/threadpool/agent/internal/transformlet/JavassistTransformlet.java @@ -1,7 +1,6 @@ package com.alibaba.ttl.threadpool.agent.internal.transformlet; import javassist.CannotCompileException; -import javassist.CtClass; import javassist.NotFoundException; import java.io.IOException; diff --git a/src/main/java/com/alibaba/ttl/threadpool/agent/internal/transformlet/impl/TtlForkJoinTransformlet.java b/src/main/java/com/alibaba/ttl/threadpool/agent/internal/transformlet/impl/TtlForkJoinTransformlet.java index f1ee79dccb46222569af242901246c53338336bb..d44ab15d9395fc2cbb829afec2cc1ce74b612aa3 100644 --- a/src/main/java/com/alibaba/ttl/threadpool/agent/internal/transformlet/impl/TtlForkJoinTransformlet.java +++ b/src/main/java/com/alibaba/ttl/threadpool/agent/internal/transformlet/impl/TtlForkJoinTransformlet.java @@ -1,11 +1,11 @@ package com.alibaba.ttl.threadpool.agent.internal.transformlet.impl; +import com.alibaba.ttl.threadpool.agent.internal.logging.Logger; import com.alibaba.ttl.threadpool.agent.internal.transformlet.JavassistTransformlet; import javassist.*; import java.io.IOException; import java.lang.reflect.Modifier; -import com.alibaba.ttl.threadpool.agent.internal.logging.Logger; import static com.alibaba.ttl.threadpool.agent.internal.transformlet.impl.Utils.getCtClass; import static com.alibaba.ttl.threadpool.agent.internal.transformlet.impl.Utils.signatureOfMethod; diff --git a/src/main/java/com/alibaba/ttl/threadpool/agent/internal/transformlet/impl/Utils.java b/src/main/java/com/alibaba/ttl/threadpool/agent/internal/transformlet/impl/Utils.java index d4f0c1ddec30453c3b42496985d440c2db0e62c9..ce4d17502b12d96dcd6cb97833822760e1adbe58 100644 --- a/src/main/java/com/alibaba/ttl/threadpool/agent/internal/transformlet/impl/Utils.java +++ b/src/main/java/com/alibaba/ttl/threadpool/agent/internal/transformlet/impl/Utils.java @@ -6,8 +6,8 @@ import java.io.ByteArrayInputStream; import java.io.IOException; /** - * @since 2.6.0 * @author Jerry Lee (oldratlee at gmail dot com) + * @since 2.6.0 */ class Utils { /** diff --git a/src/test/java/com/alibaba/demo/agent/AgentDemo.kt b/src/test/java/com/alibaba/demo/agent/AgentDemo.kt index 46bb180d1647cfa9b0e027beaca0004fa2e20597..809f473e53099abda474dc8bdaa9c158ac6817dc 100644 --- a/src/test/java/com/alibaba/demo/agent/AgentDemo.kt +++ b/src/test/java/com/alibaba/demo/agent/AgentDemo.kt @@ -3,7 +3,6 @@ package com.alibaba.demo.agent import com.alibaba.ttl.TransmittableThreadLocal -import java.lang.IllegalStateException import java.util.concurrent.ExecutorService import java.util.concurrent.Executors import java.util.concurrent.TimeUnit diff --git a/src/test/java/com/alibaba/demo/distributed_tracer/refcount/DistributedTracerUseDemo.kt b/src/test/java/com/alibaba/demo/distributed_tracer/refcount/DistributedTracerUseDemo.kt index a3443bbcf4aca60ac47c7de4bffd111c23c41d08..c57662a1eb67c852d1e809057222f5f7398fb7d1 100644 --- a/src/test/java/com/alibaba/demo/distributed_tracer/refcount/DistributedTracerUseDemo.kt +++ b/src/test/java/com/alibaba/demo/distributed_tracer/refcount/DistributedTracerUseDemo.kt @@ -2,11 +2,11 @@ package com.alibaba.demo.distributed_tracer.refcount import com.alibaba.ttl.TransmittableThreadLocal import com.alibaba.ttl.threadpool.TtlExecutors +import java.lang.Thread.sleep import java.util.concurrent.ConcurrentHashMap import java.util.concurrent.Executors import java.util.concurrent.atomic.AtomicInteger import kotlin.concurrent.thread -import java.lang.Thread.sleep /** * DistributedTracer(DT) use demo. diff --git a/src/test/java/com/alibaba/demo/timer/TimerTaskDemo.kt b/src/test/java/com/alibaba/demo/timer/TimerTaskDemo.kt index aa5a8cccc345a7cc6c57796f78e6ad44af8908cd..13e4e2be2e889b2458a77e317025a784b04e95ed 100644 --- a/src/test/java/com/alibaba/demo/timer/TimerTaskDemo.kt +++ b/src/test/java/com/alibaba/demo/timer/TimerTaskDemo.kt @@ -1,9 +1,7 @@ package com.alibaba.demo.timer import java.text.SimpleDateFormat -import java.util.Date -import java.util.Timer -import java.util.TimerTask +import java.util.* /** * @see [Java Timer TimerTask Example](https://www.journaldev.com/1050/java-timer-timertask-example) diff --git a/src/test/java/com/alibaba/ttl/threadpool/TtlExecutorsTest.kt b/src/test/java/com/alibaba/ttl/threadpool/TtlExecutorsTest.kt index 85fd2043352506518431fa0e58deaa3ab0c69c98..268563b4f2febdfb8acc438b89d45f480cc354c7 100644 --- a/src/test/java/com/alibaba/ttl/threadpool/TtlExecutorsTest.kt +++ b/src/test/java/com/alibaba/ttl/threadpool/TtlExecutorsTest.kt @@ -1,16 +1,45 @@ package com.alibaba.ttl.threadpool -import org.junit.Assert.assertNull +import com.alibaba.ttl.threadpool.TtlExecutors.* +import org.junit.Assert.* import org.junit.Test +import java.util.concurrent.Executors.newScheduledThreadPool /** * @author Jerry Lee (oldratlee at gmail dot com) */ class TtlExecutorsTest { + @Test + fun test_common() { + val newScheduledThreadPool = newScheduledThreadPool(3) + + getTtlExecutor(newScheduledThreadPool).let { + assertTrue(it is ExecutorTtlWrapper) + assertTrue(isTtlWrapper(it)) + + assertSame(newScheduledThreadPool, unwrap(it)) + } + getTtlExecutorService(newScheduledThreadPool).let { + assertTrue(it is ExecutorServiceTtlWrapper) + assertTrue(isTtlWrapper(it)) + + assertSame(newScheduledThreadPool, unwrap(it)) + } + getTtlScheduledExecutorService(newScheduledThreadPool).let { + assertTrue(it is ScheduledExecutorServiceTtlWrapper) + assertTrue(isTtlWrapper(it)) + + assertSame(newScheduledThreadPool, unwrap(it)) + } + } + @Test fun test_null() { assertNull(TtlExecutors.getTtlExecutor(null)) assertNull(TtlExecutors.getTtlExecutorService(null)) - assertNull(TtlExecutors.getTtlScheduledExecutorService(null)) + assertNull(getTtlScheduledExecutorService(null)) + + assertFalse(isTtlWrapper(null)) + assertNull(unwrap(null)) } } diff --git a/src/test/java/com/alibaba/ttl/threadpool/agent/TtlAgentTest.kt b/src/test/java/com/alibaba/ttl/threadpool/agent/TtlAgentTest.kt index add88326b069a8caf6a9faa57db49e5ba41984ee..e661eb6e2f4a9d4f5fbf99986f49227119b27296 100644 --- a/src/test/java/com/alibaba/ttl/threadpool/agent/TtlAgentTest.kt +++ b/src/test/java/com/alibaba/ttl/threadpool/agent/TtlAgentTest.kt @@ -1,10 +1,9 @@ package com.alibaba.ttl.threadpool.agent import com.alibaba.ttl.threadpool.agent.TtlAgent.splitCommaColonStringToKV +import org.junit.Assert.assertEquals import org.junit.Test -import org.junit.Assert.* - class TtlAgentTest { @Test fun test_splitCommaColonStringToKV() {