diff --git a/appveyor.yml b/appveyor.yml index 7bb074c5812f20d6cdc2716f77e6972fcf4faecc..d63d053ff5487992c91605531f3f4544abea38a3 100644 --- a/appveyor.yml +++ b/appveyor.yml @@ -27,7 +27,7 @@ install: test_script: - ./mvnw.cmd clean install --batch-mode - ./mvnw.cmd dependency:copy-dependencies -DincludeScope=test - - rm target/dependency/javassist* + - rm target/dependency/javassist* target/dependency/jsr305-* - echo "Run Agent test" - ps: | $ttl_jar=Get-ChildItem target\transmittable-thread-local-*.jar -Exclude *-sources.jar | Select-Object -ExpandProperty FullName diff --git a/pom.xml b/pom.xml index adcba97fe8dc276c119990ff94db14068cfb667a..0bb53abf46ea3cae26ac76a370a8ffa5fe3bd387 100644 --- a/pom.xml +++ b/pom.xml @@ -95,6 +95,12 @@ 3.23.1-GA true + + com.google.code.findbugs + jsr305 + 3.0.2 + true + junit diff --git a/pom4ide.xml b/pom4ide.xml index fd84125ab7715505c9acbbd232aebd1c22f857bd..b48bb166e8e48d94d52d2d65beb9884bfc3c6846 100644 --- a/pom4ide.xml +++ b/pom4ide.xml @@ -95,6 +95,12 @@ 3.23.1-GA true + + com.google.code.findbugs + jsr305 + 3.0.2 + true + junit diff --git a/scripts/common.sh b/scripts/common.sh index 9bd42507a7a32d4cdc81f0211ef6b99bc319ba43..dc15992add2f10f80e0661db8d9a6b8e7d078d31 100644 --- a/scripts/common.sh +++ b/scripts/common.sh @@ -117,13 +117,13 @@ mvnCopyDependencies() { runCmd "${MVN_CMD[@]}" dependency:copy-dependencies -DincludeScope=test || die "fail to mvn copy-dependencies!" # remove repackaged and shaded javassist lib - rm $dependencies_dir/javassist-* + rm "$dependencies_dir"/javassist-* "$dependencies_dir"/jsr305-* } getClasspathOfDependencies() { [ -e "$dependencies_dir" ] || mvnCopyDependencies 1>&2 - echo $dependencies_dir/*.jar | tr ' ' : + echo "$dependencies_dir"/*.jar | tr ' ' : } getClasspathWithoutTtlJar() { diff --git a/src/main/java/com/alibaba/ttl/TransmittableThreadLocal.java b/src/main/java/com/alibaba/ttl/TransmittableThreadLocal.java index 8fe745fdc34d0b7cd37932e5fd7a3b1c0f824b58..3a30f52216b88c95cf05b1cfea4131725e15f310 100644 --- a/src/main/java/com/alibaba/ttl/TransmittableThreadLocal.java +++ b/src/main/java/com/alibaba/ttl/TransmittableThreadLocal.java @@ -1,5 +1,7 @@ package com.alibaba.ttl; +import javax.annotation.Nonnull; +import javax.annotation.Nullable; import java.util.HashMap; import java.util.Iterator; import java.util.Map; @@ -145,7 +147,7 @@ public class TransmittableThreadLocal extends InheritableThreadLocal { /** * Debug only method! */ - static void dump(String title) { + static void dump(@Nullable String title) { if (title != null && title.length() > 0) { System.out.printf("Start TransmittableThreadLocal[%s] Dump...\n", title); } else { @@ -248,6 +250,7 @@ public class TransmittableThreadLocal extends InheritableThreadLocal { * @return the captured {@link TransmittableThreadLocal} values * @since 2.3.0 */ + @Nonnull public static Object capture() { Map, Object> captured = new HashMap, Object>(); for (TransmittableThreadLocal threadLocal : holder.get().keySet()) { @@ -265,7 +268,8 @@ public class TransmittableThreadLocal extends InheritableThreadLocal { * @see #capture() * @since 2.3.0 */ - public static Object replay(Object captured) { + @Nonnull + public static Object replay(@Nonnull Object captured) { @SuppressWarnings("unchecked") Map, Object> capturedMap = (Map, Object>) captured; Map, Object> backup = new HashMap, Object>(); @@ -301,7 +305,7 @@ public class TransmittableThreadLocal extends InheritableThreadLocal { * @param backup the backup {@link TransmittableThreadLocal} values from {@link Transmitter#replay(Object)} * @since 2.3.0 */ - public static void restore(Object backup) { + public static void restore(@Nonnull Object backup) { @SuppressWarnings("unchecked") Map, Object> backupMap = (Map, Object>) backup; // call afterExecute callback @@ -324,7 +328,7 @@ public class TransmittableThreadLocal extends InheritableThreadLocal { setTtlValuesTo(backupMap); } - private static void setTtlValuesTo(Map, Object> ttlValues) { + private static void setTtlValuesTo(@Nonnull Map, Object> ttlValues) { for (Map.Entry, Object> entry : ttlValues.entrySet()) { @SuppressWarnings("unchecked") TransmittableThreadLocal threadLocal = (TransmittableThreadLocal) entry.getKey(); @@ -344,7 +348,7 @@ public class TransmittableThreadLocal extends InheritableThreadLocal { * @see #restore(Object) * @since 2.3.1 */ - public static R runSupplierWithCaptured(Object captured, Supplier bizLogic) { + public static R runSupplierWithCaptured(@Nonnull Object captured, Supplier bizLogic) { Object backup = replay(captured); try { return bizLogic.get(); diff --git a/src/main/java/com/alibaba/ttl/TtlCallable.java b/src/main/java/com/alibaba/ttl/TtlCallable.java index 01f4a7e32360bb8685e8eb03ca300a78d78d6feb..fa77b0be71062cec521d967cecb0e0421389697c 100644 --- a/src/main/java/com/alibaba/ttl/TtlCallable.java +++ b/src/main/java/com/alibaba/ttl/TtlCallable.java @@ -1,5 +1,7 @@ package com.alibaba.ttl; +import javax.annotation.Nonnull; +import javax.annotation.Nullable; import java.util.ArrayList; import java.util.Collection; import java.util.Collections; @@ -31,7 +33,7 @@ public final class TtlCallable implements Callable { private final Callable callable; private final boolean releaseTtlValueReferenceAfterCall; - private TtlCallable(Callable callable, boolean releaseTtlValueReferenceAfterCall) { + private TtlCallable(@Nonnull Callable callable, boolean releaseTtlValueReferenceAfterCall) { this.capturedRef = new AtomicReference(capture()); this.callable = callable; this.releaseTtlValueReferenceAfterCall = releaseTtlValueReferenceAfterCall; @@ -55,6 +57,7 @@ public final class TtlCallable implements Callable { } } + @Nonnull public Callable getCallable() { return callable; } @@ -101,7 +104,8 @@ public final class TtlCallable implements Callable { * @param releaseTtlValueReferenceAfterCall release TTL value reference after run, avoid memory leak even if {@link TtlRunnable} is referred. * @return Wrapped {@link Callable} */ - public static TtlCallable get(Callable callable, boolean releaseTtlValueReferenceAfterCall) { + @Nullable + public static TtlCallable get(@Nullable Callable callable, boolean releaseTtlValueReferenceAfterCall) { return get(callable, releaseTtlValueReferenceAfterCall, false); } @@ -115,7 +119,8 @@ public final class TtlCallable implements Callable { * @param idempotent is idempotent or not. {@code true} will cover up bugs! DO NOT set, only when you know why. * @return Wrapped {@link Callable} */ - public static TtlCallable get(Callable callable, boolean releaseTtlValueReferenceAfterCall, boolean idempotent) { + @Nullable + public static TtlCallable get(@Nullable Callable callable, boolean releaseTtlValueReferenceAfterCall, boolean idempotent) { if (null == callable) { return null; } @@ -137,7 +142,8 @@ public final class TtlCallable implements Callable { * @param tasks task to be wrapped * @return Wrapped {@link Callable} */ - public static List> gets(Collection> tasks) { + @Nonnull + public static List> gets(@Nullable Collection> tasks) { return gets(tasks, false, false); } @@ -148,7 +154,8 @@ public final class TtlCallable implements Callable { * @param releaseTtlValueReferenceAfterCall release TTL value reference after run, avoid memory leak even if {@link TtlRunnable} is referred. * @return Wrapped {@link Callable} */ - public static List> gets(Collection> tasks, boolean releaseTtlValueReferenceAfterCall) { + @Nonnull + public static List> gets(@Nullable Collection> tasks, boolean releaseTtlValueReferenceAfterCall) { return gets(tasks, releaseTtlValueReferenceAfterCall, false); } @@ -160,7 +167,8 @@ public final class TtlCallable implements Callable { * @param idempotent is idempotent or not. {@code true} will cover up bugs! DO NOT set, only when you know why. * @return Wrapped {@link Callable} */ - public static List> gets(Collection> tasks, boolean releaseTtlValueReferenceAfterCall, boolean idempotent) { + @Nonnull + public static List> gets(@Nullable Collection> tasks, boolean releaseTtlValueReferenceAfterCall, boolean idempotent) { if (null == tasks) { return Collections.emptyList(); } diff --git a/src/main/java/com/alibaba/ttl/TtlRunnable.java b/src/main/java/com/alibaba/ttl/TtlRunnable.java index f718b67904bed1d9e1255b1e7aca5dbc2ee4bdc3..3132f2f35dd9f9e802ee55f3ebb7de633ebc509d 100644 --- a/src/main/java/com/alibaba/ttl/TtlRunnable.java +++ b/src/main/java/com/alibaba/ttl/TtlRunnable.java @@ -1,5 +1,7 @@ package com.alibaba.ttl; +import javax.annotation.Nonnull; +import javax.annotation.Nullable; import java.util.ArrayList; import java.util.Collection; import java.util.Collections; @@ -28,7 +30,7 @@ public final class TtlRunnable implements Runnable { private final Runnable runnable; private final boolean releaseTtlValueReferenceAfterRun; - private TtlRunnable(Runnable runnable, boolean releaseTtlValueReferenceAfterRun) { + private TtlRunnable(@Nonnull Runnable runnable, boolean releaseTtlValueReferenceAfterRun) { this.capturedRef = new AtomicReference(capture()); this.runnable = runnable; this.releaseTtlValueReferenceAfterRun = releaseTtlValueReferenceAfterRun; @@ -55,6 +57,7 @@ public final class TtlRunnable implements Runnable { /** * return original/unwrapped {@link Runnable}. */ + @Nonnull public Runnable getRunnable() { return runnable; } @@ -86,7 +89,8 @@ public final class TtlRunnable implements Runnable { * @return Wrapped {@link Runnable} * @throws IllegalStateException when input is {@link TtlRunnable} already. */ - public static TtlRunnable get(Runnable runnable) { + @Nullable + public static TtlRunnable get(@Nullable Runnable runnable) { return get(runnable, false, false); } @@ -98,7 +102,8 @@ public final class TtlRunnable implements Runnable { * @return Wrapped {@link Runnable} * @throws IllegalStateException when input is {@link TtlRunnable} already. */ - public static TtlRunnable get(Runnable runnable, boolean releaseTtlValueReferenceAfterRun) { + @Nullable + public static TtlRunnable get(@Nullable Runnable runnable, boolean releaseTtlValueReferenceAfterRun) { return get(runnable, releaseTtlValueReferenceAfterRun, false); } @@ -113,7 +118,8 @@ public final class TtlRunnable implements Runnable { * @return Wrapped {@link Runnable} * @throws IllegalStateException when input is {@link TtlRunnable} already and not idempotent. */ - public static TtlRunnable get(Runnable runnable, boolean releaseTtlValueReferenceAfterRun, boolean idempotent) { + @Nullable + public static TtlRunnable get(@Nullable Runnable runnable, boolean releaseTtlValueReferenceAfterRun, boolean idempotent) { if (null == runnable) { return null; } @@ -136,7 +142,8 @@ public final class TtlRunnable implements Runnable { * @return wrapped tasks * @throws IllegalStateException when input is {@link TtlRunnable} already. */ - public static List gets(Collection tasks) { + @Nonnull + public static List gets(@Nullable Collection tasks) { return gets(tasks, false, false); } @@ -148,7 +155,8 @@ public final class TtlRunnable implements Runnable { * @return wrapped tasks * @throws IllegalStateException when input is {@link TtlRunnable} already. */ - public static List gets(Collection tasks, boolean releaseTtlValueReferenceAfterRun) { + @Nonnull + public static List gets(@Nullable Collection tasks, boolean releaseTtlValueReferenceAfterRun) { return gets(tasks, releaseTtlValueReferenceAfterRun, false); } @@ -163,7 +171,8 @@ public final class TtlRunnable implements Runnable { * @return wrapped tasks * @throws IllegalStateException when input is {@link TtlRunnable} already and not idempotent. */ - public static List gets(Collection tasks, boolean releaseTtlValueReferenceAfterRun, boolean idempotent) { + @Nonnull + public static List gets(@Nullable Collection tasks, boolean releaseTtlValueReferenceAfterRun, boolean idempotent) { if (null == tasks) { return Collections.emptyList(); } diff --git a/src/main/java/com/alibaba/ttl/TtlTimerTask.java b/src/main/java/com/alibaba/ttl/TtlTimerTask.java index d1cafde26501574e4db24bc068886801891c12f6..29b059aaf0914512ae5364587c5ef6e2d0eeb308 100644 --- a/src/main/java/com/alibaba/ttl/TtlTimerTask.java +++ b/src/main/java/com/alibaba/ttl/TtlTimerTask.java @@ -1,5 +1,7 @@ package com.alibaba.ttl; +import javax.annotation.Nonnull; +import javax.annotation.Nullable; import java.util.TimerTask; import java.util.concurrent.atomic.AtomicReference; @@ -28,7 +30,7 @@ public final class TtlTimerTask extends TimerTask { private final TimerTask timerTask; private final boolean releaseTtlValueReferenceAfterRun; - private TtlTimerTask(TimerTask timerTask, boolean releaseTtlValueReferenceAfterRun) { + private TtlTimerTask(@Nonnull TimerTask timerTask, boolean releaseTtlValueReferenceAfterRun) { this.capturedRef = new AtomicReference(capture()); this.timerTask = timerTask; this.releaseTtlValueReferenceAfterRun = releaseTtlValueReferenceAfterRun; @@ -58,6 +60,7 @@ public final class TtlTimerTask extends TimerTask { return super.cancel(); } + @Nonnull public TimerTask getTimerTask() { return timerTask; } @@ -70,7 +73,8 @@ public final class TtlTimerTask extends TimerTask { * @param timerTask input {@link TimerTask} * @return Wrapped {@link TimerTask} */ - public static TtlTimerTask get(TimerTask timerTask) { + @Nullable + public static TtlTimerTask get(@Nullable TimerTask timerTask) { return get(timerTask, false, false); } @@ -83,7 +87,8 @@ public final class TtlTimerTask extends TimerTask { * @param releaseTtlValueReferenceAfterRun release TTL value reference after run, avoid memory leak even if {@link TtlRunnable} is referred. * @return Wrapped {@link TimerTask} */ - public static TtlTimerTask get(TimerTask timerTask, boolean releaseTtlValueReferenceAfterRun) { + @Nullable + public static TtlTimerTask get(@Nullable TimerTask timerTask, boolean releaseTtlValueReferenceAfterRun) { return get(timerTask, releaseTtlValueReferenceAfterRun, false); } @@ -97,7 +102,8 @@ public final class TtlTimerTask extends TimerTask { * @param idempotent is idempotent or not. {@code true} will cover up bugs! DO NOT set, only when you know why. * @return Wrapped {@link TimerTask} */ - public static TtlTimerTask get(TimerTask timerTask, boolean releaseTtlValueReferenceAfterRun, boolean idempotent) { + @Nullable + public static TtlTimerTask get(@Nullable TimerTask timerTask, boolean releaseTtlValueReferenceAfterRun, boolean idempotent) { if (null == timerTask) { return null; } diff --git a/src/main/java/com/alibaba/ttl/threadpool/ExecutorServiceTtlWrapper.java b/src/main/java/com/alibaba/ttl/threadpool/ExecutorServiceTtlWrapper.java index 881adb62ed14fefb40c5951c4213218c465cafd1..815aa54bbf909a3d142c6b99dc997a067e1edace 100644 --- a/src/main/java/com/alibaba/ttl/threadpool/ExecutorServiceTtlWrapper.java +++ b/src/main/java/com/alibaba/ttl/threadpool/ExecutorServiceTtlWrapper.java @@ -4,6 +4,7 @@ import com.alibaba.ttl.TransmittableThreadLocal; import com.alibaba.ttl.TtlCallable; import com.alibaba.ttl.TtlRunnable; +import javax.annotation.Nonnull; import java.util.Collection; import java.util.List; import java.util.concurrent.*; @@ -19,7 +20,7 @@ import java.util.concurrent.*; class ExecutorServiceTtlWrapper extends ExecutorTtlWrapper implements ExecutorService { private final ExecutorService executorService; - ExecutorServiceTtlWrapper(ExecutorService executorService) { + ExecutorServiceTtlWrapper(@Nonnull ExecutorService executorService) { super(executorService); this.executorService = executorService; } @@ -29,6 +30,7 @@ class ExecutorServiceTtlWrapper extends ExecutorTtlWrapper implements ExecutorSe executorService.shutdown(); } + @Nonnull @Override public List shutdownNow() { return executorService.shutdownNow(); @@ -45,45 +47,52 @@ class ExecutorServiceTtlWrapper extends ExecutorTtlWrapper implements ExecutorSe } @Override - public boolean awaitTermination(long timeout, TimeUnit unit) throws InterruptedException { + public boolean awaitTermination(long timeout, @Nonnull TimeUnit unit) throws InterruptedException { return executorService.awaitTermination(timeout, unit); } + @Nonnull @Override - public Future submit(Callable task) { + public Future submit(@Nonnull Callable task) { return executorService.submit(TtlCallable.get(task)); } + @Nonnull @Override - public Future submit(Runnable task, T result) { + public Future submit(@Nonnull Runnable task, T result) { return executorService.submit(TtlRunnable.get(task), result); } + @Nonnull @Override - public Future submit(Runnable task) { + public Future submit(@Nonnull Runnable task) { return executorService.submit(TtlRunnable.get(task)); } + @Nonnull @Override - public List> invokeAll(Collection> tasks) throws InterruptedException { + public List> invokeAll(@Nonnull Collection> tasks) throws InterruptedException { return executorService.invokeAll(TtlCallable.gets(tasks)); } + @Nonnull @Override - public List> invokeAll(Collection> tasks, long timeout, TimeUnit unit) throws InterruptedException { + public List> invokeAll(@Nonnull Collection> tasks, long timeout, @Nonnull TimeUnit unit) throws InterruptedException { return executorService.invokeAll(TtlCallable.gets(tasks), timeout, unit); } + @Nonnull @Override - public T invokeAny(Collection> tasks) throws InterruptedException, ExecutionException { + public T invokeAny(@Nonnull Collection> tasks) throws InterruptedException, ExecutionException { return executorService.invokeAny(TtlCallable.gets(tasks)); } @Override - public T invokeAny(Collection> tasks, long timeout, TimeUnit unit) throws InterruptedException, ExecutionException, TimeoutException { + public T invokeAny(@Nonnull Collection> tasks, long timeout, @Nonnull TimeUnit unit) throws InterruptedException, ExecutionException, TimeoutException { return executorService.invokeAny(TtlCallable.gets(tasks), timeout, unit); } + @Nonnull @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 d926925c686aec616bc2c8717e5d256e6b197591..ae4f24d017b7fb75b8206c7ee0c0a1b4c7af2816 100644 --- a/src/main/java/com/alibaba/ttl/threadpool/ExecutorTtlWrapper.java +++ b/src/main/java/com/alibaba/ttl/threadpool/ExecutorTtlWrapper.java @@ -3,6 +3,7 @@ package com.alibaba.ttl.threadpool; import com.alibaba.ttl.TransmittableThreadLocal; import com.alibaba.ttl.TtlRunnable; +import javax.annotation.Nonnull; import java.util.concurrent.Executor; /** @@ -16,15 +17,16 @@ import java.util.concurrent.Executor; class ExecutorTtlWrapper implements Executor { private final Executor executor; - ExecutorTtlWrapper(Executor executor) { + ExecutorTtlWrapper(@Nonnull Executor executor) { this.executor = executor; } @Override - public void execute(Runnable command) { + public void execute(@Nonnull Runnable command) { executor.execute(TtlRunnable.get(command)); } + @Nonnull 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 6c2641ca74bade7a6d1376f8e7f5ad98a00631a3..8266031b0ef3fd8c4dd6fb5377c21e50d0391559 100644 --- a/src/main/java/com/alibaba/ttl/threadpool/ScheduledExecutorServiceTtlWrapper.java +++ b/src/main/java/com/alibaba/ttl/threadpool/ScheduledExecutorServiceTtlWrapper.java @@ -4,6 +4,7 @@ import com.alibaba.ttl.TransmittableThreadLocal; import com.alibaba.ttl.TtlCallable; import com.alibaba.ttl.TtlRunnable; +import javax.annotation.Nonnull; import java.util.concurrent.*; /** @@ -17,32 +18,37 @@ import java.util.concurrent.*; class ScheduledExecutorServiceTtlWrapper extends ExecutorServiceTtlWrapper implements ScheduledExecutorService { final ScheduledExecutorService scheduledExecutorService; - public ScheduledExecutorServiceTtlWrapper(ScheduledExecutorService scheduledExecutorService) { + public ScheduledExecutorServiceTtlWrapper(@Nonnull ScheduledExecutorService scheduledExecutorService) { super(scheduledExecutorService); this.scheduledExecutorService = scheduledExecutorService; } + @Nonnull @Override - public ScheduledFuture schedule(Runnable command, long delay, TimeUnit unit) { + public ScheduledFuture schedule(@Nonnull Runnable command, long delay, @Nonnull TimeUnit unit) { return scheduledExecutorService.schedule(TtlRunnable.get(command), delay, unit); } + @Nonnull @Override - public ScheduledFuture schedule(Callable callable, long delay, TimeUnit unit) { + public ScheduledFuture schedule(@Nonnull Callable callable, long delay, @Nonnull TimeUnit unit) { return scheduledExecutorService.schedule(TtlCallable.get(callable), delay, unit); } + @Nonnull @Override - public ScheduledFuture scheduleAtFixedRate(Runnable command, long initialDelay, long period, TimeUnit unit) { + public ScheduledFuture scheduleAtFixedRate(@Nonnull Runnable command, long initialDelay, long period, @Nonnull TimeUnit unit) { return scheduledExecutorService.scheduleAtFixedRate(TtlRunnable.get(command), initialDelay, period, unit); } + @Nonnull @Override - public ScheduledFuture scheduleWithFixedDelay(Runnable command, long initialDelay, long delay, TimeUnit unit) { + public ScheduledFuture scheduleWithFixedDelay(@Nonnull Runnable command, long initialDelay, long delay, @Nonnull TimeUnit unit) { return scheduledExecutorService.scheduleWithFixedDelay(TtlRunnable.get(command), initialDelay, delay, unit); } @Override + @Nonnull 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 d82b689c8c27879dbb17cec3d77613903badabc8..4c0e9ed8ac2f492f758b0943854accdc1e547103 100644 --- a/src/main/java/com/alibaba/ttl/threadpool/TtlExecutors.java +++ b/src/main/java/com/alibaba/ttl/threadpool/TtlExecutors.java @@ -2,6 +2,7 @@ package com.alibaba.ttl.threadpool; import com.alibaba.ttl.TransmittableThreadLocal; +import javax.annotation.Nullable; import java.util.concurrent.Executor; import java.util.concurrent.ExecutorService; import java.util.concurrent.ScheduledExecutorService; @@ -25,7 +26,8 @@ public final class TtlExecutors { * transmit the {@link TransmittableThreadLocal} from the task submit time of {@link Runnable} * to the execution time of {@link Runnable}. */ - public static Executor getTtlExecutor(Executor executor) { + @Nullable + public static Executor getTtlExecutor(@Nullable Executor executor) { if (null == executor || executor instanceof ExecutorTtlWrapper) { return executor; } @@ -37,7 +39,8 @@ public final class TtlExecutors { * transmit the {@link TransmittableThreadLocal} from the task submit time of {@link Runnable} or {@link java.util.concurrent.Callable} * to the execution time of {@link Runnable} or {@link java.util.concurrent.Callable}. */ - public static ExecutorService getTtlExecutorService(ExecutorService executorService) { + @Nullable + public static ExecutorService getTtlExecutorService(@Nullable ExecutorService executorService) { if (executorService == null || executorService instanceof ExecutorServiceTtlWrapper) { return executorService; } @@ -49,7 +52,8 @@ public final class TtlExecutors { * transmit the {@link TransmittableThreadLocal} from the task submit time of {@link Runnable} or {@link java.util.concurrent.Callable} * to the execution time of {@link Runnable} or {@link java.util.concurrent.Callable}. */ - public static ScheduledExecutorService getTtlScheduledExecutorService(ScheduledExecutorService scheduledExecutorService) { + @Nullable + public static ScheduledExecutorService getTtlScheduledExecutorService(@Nullable ScheduledExecutorService scheduledExecutorService) { if (scheduledExecutorService == null || scheduledExecutorService instanceof ScheduledExecutorServiceTtlWrapper) { return scheduledExecutorService; } @@ -71,7 +75,7 @@ public final class TtlExecutors { * @see #unwrap(Executor) * @since 2.8.0 */ - public static boolean isTtlWrapper(T executor) { + public static boolean isTtlWrapper(@Nullable T executor) { return (executor instanceof ExecutorTtlWrapper); } @@ -91,8 +95,9 @@ public final class TtlExecutors { * @see #isTtlWrapper(Executor) * @since 2.8.0 */ + @Nullable @SuppressWarnings("unchecked") - public static T unwrap(T executor) { + public static T unwrap(@Nullable T executor) { if (!isTtlWrapper(executor)) return executor; return (T) ((ExecutorTtlWrapper) executor).unwrap(); 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 7ce14d812e5b34732f2b15b89b655801c79ca2c5..ec098002daefa5d769fa3e00feca6623b8c74e4d 100644 --- a/src/main/java/com/alibaba/ttl/threadpool/agent/TtlAgent.java +++ b/src/main/java/com/alibaba/ttl/threadpool/agent/TtlAgent.java @@ -7,6 +7,8 @@ import com.alibaba.ttl.threadpool.agent.internal.transformlet.impl.TtlExecutorTr import com.alibaba.ttl.threadpool.agent.internal.transformlet.impl.TtlForkJoinTransformlet; import com.alibaba.ttl.threadpool.agent.internal.transformlet.impl.TtlTimerTaskTransformlet; +import javax.annotation.Nonnull; +import javax.annotation.Nullable; import java.lang.instrument.ClassFileTransformer; import java.lang.instrument.Instrumentation; import java.util.ArrayList; @@ -91,7 +93,7 @@ public final class TtlAgent { * @see Logger#STDERR * @see Logger#STDOUT */ - public static void premain(String agentArgs, Instrumentation inst) { + public static void premain(String agentArgs, @Nonnull Instrumentation inst) { final Map kvs = splitCommaColonStringToKV(agentArgs); Logger.setLoggerImplType(getLogImplTypeFromAgentArgs(kvs)); @@ -119,13 +121,13 @@ public final class TtlAgent { } } - private static String getLogImplTypeFromAgentArgs(final Map kvs) { + private static String getLogImplTypeFromAgentArgs(@Nonnull final Map kvs) { return kvs.get(Logger.TTL_AGENT_LOGGER_KEY); } private static final String TTL_AGENT_ENABLE_TIMER_TASK_KEY = "ttl.agent.enable.timer.task"; - private static boolean enableTimerTask(final Map kvs) { + private static boolean enableTimerTask(@Nonnull final Map kvs) { final boolean hasEnableKey = kvs.containsKey(TTL_AGENT_ENABLE_TIMER_TASK_KEY); if (!hasEnableKey) return false; @@ -135,7 +137,8 @@ public final class TtlAgent { /** * Split to {@code json} like String({@code "k1:v1,k2:v2"}) to KV map({@code "k1"->"v1", "k2"->"v2"}). */ - static Map splitCommaColonStringToKV(String commaColonString) { + @Nonnull + static Map splitCommaColonStringToKV(@Nullable String commaColonString) { Map ret = new HashMap(); if (commaColonString == null || commaColonString.trim().length() == 0) return ret; diff --git a/src/main/java/com/alibaba/ttl/threadpool/agent/TtlTransformer.java b/src/main/java/com/alibaba/ttl/threadpool/agent/TtlTransformer.java index 00894535f22adc451e8f40df3753e8f1632d2c20..b8ae28fc8b292d07ac60940ea037d66dd515fb32 100644 --- a/src/main/java/com/alibaba/ttl/threadpool/agent/TtlTransformer.java +++ b/src/main/java/com/alibaba/ttl/threadpool/agent/TtlTransformer.java @@ -3,6 +3,8 @@ package com.alibaba.ttl.threadpool.agent; import com.alibaba.ttl.threadpool.agent.internal.logging.Logger; import com.alibaba.ttl.threadpool.agent.internal.transformlet.JavassistTransformlet; +import javax.annotation.Nonnull; +import javax.annotation.Nullable; import java.lang.instrument.ClassFileTransformer; import java.security.ProtectionDomain; import java.util.ArrayList; @@ -34,7 +36,7 @@ public class TtlTransformer implements ClassFileTransformer { } @Override - public final byte[] transform(final ClassLoader loader, final String classFile, final Class classBeingRedefined, + public final byte[] transform(@Nonnull final ClassLoader loader, @Nullable final String classFile, final Class classBeingRedefined, final ProtectionDomain protectionDomain, final byte[] classFileBuffer) { try { // Lambda has no class file, no need to transform, just return. 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 c57662a1eb67c852d1e809057222f5f7398fb7d1..095f3c146f0a08462fe9dc56a1a030a2c3ce7e2e 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 @@ -43,11 +43,9 @@ private fun rpcInvokeIn() { decreaseSpanIdRefCount() } -private val executorService = TtlExecutors.getTtlExecutorService( - Executors.newFixedThreadPool(1) { r: Runnable -> - Thread(r, "Executors").apply { isDaemon = true } - } -) +private val executorService = Executors.newFixedThreadPool(1) { r: Runnable -> + Thread(r, "Executors").apply { isDaemon = true } +}.let { TtlExecutors.getTtlExecutorService(it) }!! private fun syncMethod() { // async call by TTL Executor, Test OK! diff --git a/src/test/java/com/alibaba/demo/distributed_tracer/weakref/DistributedTracerUseDemo_WeakReferenceInsteadOfRefCounter.kt b/src/test/java/com/alibaba/demo/distributed_tracer/weakref/DistributedTracerUseDemo_WeakReferenceInsteadOfRefCounter.kt index 66ee80aa6ef8eb66c5d5a76449a95d4f6f6b154c..4439a4e4b2ff648f14d1bf1b2c9204d2603d8b76 100644 --- a/src/test/java/com/alibaba/demo/distributed_tracer/weakref/DistributedTracerUseDemo_WeakReferenceInsteadOfRefCounter.kt +++ b/src/test/java/com/alibaba/demo/distributed_tracer/weakref/DistributedTracerUseDemo_WeakReferenceInsteadOfRefCounter.kt @@ -17,7 +17,7 @@ private val executorService: ExecutorService = Executors.newFixedThreadPool(1) { // ensure threads in pool is pre-created. expandThreadPool(it) TtlExecutors.getTtlExecutorService(it) -} +}!! /** * DistributedTracer(DT) use demo. diff --git a/src/test/java/com/alibaba/ttl/TtlCallableTest.kt b/src/test/java/com/alibaba/ttl/TtlCallableTest.kt index 935cdaa7ffd74d337bbc23f233750c41ad2e0739..63e8acd13889d8152278a6ad22f3419dc199e7aa 100644 --- a/src/test/java/com/alibaba/ttl/TtlCallableTest.kt +++ b/src/test/java/com/alibaba/ttl/TtlCallableTest.kt @@ -94,7 +94,7 @@ class TtlCallableTest { val ttlInstances = createParentTtlInstances() val call = Call("1", ttlInstances) - val ttlCallable = TtlCallable.get(call, true) + val ttlCallable = TtlCallable.get(call, true)!! assertSame(call, ttlCallable.callable) assertEquals("ok", executorService.submit(ttlCallable).get()) diff --git a/src/test/java/com/alibaba/ttl/TtlRunnableTest.kt b/src/test/java/com/alibaba/ttl/TtlRunnableTest.kt index 6603a2b1b9bbab5633a74ca4c0e0cbe25ba539b5..dd34046670e9c33bf1ffb864cfd43a5ec57c15d2 100644 --- a/src/test/java/com/alibaba/ttl/TtlRunnableTest.kt +++ b/src/test/java/com/alibaba/ttl/TtlRunnableTest.kt @@ -24,7 +24,7 @@ class TtlRunnableTest { val ttlInstances = createParentTtlInstances() val task = Task("1", ttlInstances) - val ttlRunnable = TtlRunnable.get(task) + val ttlRunnable = TtlRunnable.get(task)!! // create after new Task, won't see parent value in in task! createParentTtlInstancesAfterCreateChild(ttlInstances) @@ -204,7 +204,7 @@ class TtlRunnableTest { @Test fun test_get_same() { val task = Task("1") - val ttlRunnable = TtlRunnable.get(task) + val ttlRunnable = TtlRunnable.get(task)!! assertSame(task, ttlRunnable.runnable) } diff --git a/src/test/java/com/alibaba/ttl/threadpool/ScheduledExecutorServiceTtlWrapperTest.kt b/src/test/java/com/alibaba/ttl/threadpool/ScheduledExecutorServiceTtlWrapperTest.kt index 1f1e705dcbe0540eeed5fec9cb1875fa04767ba5..c54b159aed4b22790c519eea44fe0bbcb48bf784 100644 --- a/src/test/java/com/alibaba/ttl/threadpool/ScheduledExecutorServiceTtlWrapperTest.kt +++ b/src/test/java/com/alibaba/ttl/threadpool/ScheduledExecutorServiceTtlWrapperTest.kt @@ -235,7 +235,7 @@ class ScheduledExecutorServiceTtlWrapperTest { it.setKeepAliveTime(10, TimeUnit.SECONDS) expandThreadPool(it) TtlExecutors.getTtlScheduledExecutorService(it) - } + }!! @AfterClass @Suppress("unused")