提交 f598e795 编写于 作者: oldratlee's avatar oldratlee 🔥

JSR 305 intergration #101

上级 7d3c6dd1
......@@ -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
......
......@@ -95,6 +95,12 @@
<version>3.23.1-GA</version>
<optional>true</optional>
</dependency>
<dependency>
<groupId>com.google.code.findbugs</groupId>
<artifactId>jsr305</artifactId>
<version>3.0.2</version>
<optional>true</optional>
</dependency>
<!-- Testing frameworks and related dependencies -->
<dependency>
<groupId>junit</groupId>
......
......@@ -95,6 +95,12 @@
<version>3.23.1-GA</version>
<optional>true</optional>
</dependency>
<dependency>
<groupId>com.google.code.findbugs</groupId>
<artifactId>jsr305</artifactId>
<version>3.0.2</version>
<optional>true</optional>
</dependency>
<!-- Testing frameworks and related dependencies -->
<dependency>
<groupId>junit</groupId>
......
......@@ -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() {
......
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<T> extends InheritableThreadLocal<T> {
/**
* 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<T> extends InheritableThreadLocal<T> {
* @return the captured {@link TransmittableThreadLocal} values
* @since 2.3.0
*/
@Nonnull
public static Object capture() {
Map<TransmittableThreadLocal<?>, Object> captured = new HashMap<TransmittableThreadLocal<?>, Object>();
for (TransmittableThreadLocal<?> threadLocal : holder.get().keySet()) {
......@@ -265,7 +268,8 @@ public class TransmittableThreadLocal<T> extends InheritableThreadLocal<T> {
* @see #capture()
* @since 2.3.0
*/
public static Object replay(Object captured) {
@Nonnull
public static Object replay(@Nonnull Object captured) {
@SuppressWarnings("unchecked")
Map<TransmittableThreadLocal<?>, Object> capturedMap = (Map<TransmittableThreadLocal<?>, Object>) captured;
Map<TransmittableThreadLocal<?>, Object> backup = new HashMap<TransmittableThreadLocal<?>, Object>();
......@@ -301,7 +305,7 @@ public class TransmittableThreadLocal<T> extends InheritableThreadLocal<T> {
* @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<TransmittableThreadLocal<?>, Object> backupMap = (Map<TransmittableThreadLocal<?>, Object>) backup;
// call afterExecute callback
......@@ -324,7 +328,7 @@ public class TransmittableThreadLocal<T> extends InheritableThreadLocal<T> {
setTtlValuesTo(backupMap);
}
private static void setTtlValuesTo(Map<TransmittableThreadLocal<?>, Object> ttlValues) {
private static void setTtlValuesTo(@Nonnull Map<TransmittableThreadLocal<?>, Object> ttlValues) {
for (Map.Entry<TransmittableThreadLocal<?>, Object> entry : ttlValues.entrySet()) {
@SuppressWarnings("unchecked")
TransmittableThreadLocal<Object> threadLocal = (TransmittableThreadLocal<Object>) entry.getKey();
......@@ -344,7 +348,7 @@ public class TransmittableThreadLocal<T> extends InheritableThreadLocal<T> {
* @see #restore(Object)
* @since 2.3.1
*/
public static <R> R runSupplierWithCaptured(Object captured, Supplier<R> bizLogic) {
public static <R> R runSupplierWithCaptured(@Nonnull Object captured, Supplier<R> bizLogic) {
Object backup = replay(captured);
try {
return bizLogic.get();
......
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<V> implements Callable<V> {
private final Callable<V> callable;
private final boolean releaseTtlValueReferenceAfterCall;
private TtlCallable(Callable<V> callable, boolean releaseTtlValueReferenceAfterCall) {
private TtlCallable(@Nonnull Callable<V> callable, boolean releaseTtlValueReferenceAfterCall) {
this.capturedRef = new AtomicReference<Object>(capture());
this.callable = callable;
this.releaseTtlValueReferenceAfterCall = releaseTtlValueReferenceAfterCall;
......@@ -55,6 +57,7 @@ public final class TtlCallable<V> implements Callable<V> {
}
}
@Nonnull
public Callable<V> getCallable() {
return callable;
}
......@@ -101,7 +104,8 @@ public final class TtlCallable<V> implements Callable<V> {
* @param releaseTtlValueReferenceAfterCall release TTL value reference after run, avoid memory leak even if {@link TtlRunnable} is referred.
* @return Wrapped {@link Callable}
*/
public static <T> TtlCallable<T> get(Callable<T> callable, boolean releaseTtlValueReferenceAfterCall) {
@Nullable
public static <T> TtlCallable<T> get(@Nullable Callable<T> callable, boolean releaseTtlValueReferenceAfterCall) {
return get(callable, releaseTtlValueReferenceAfterCall, false);
}
......@@ -115,7 +119,8 @@ public final class TtlCallable<V> implements Callable<V> {
* @param idempotent is idempotent or not. {@code true} will cover up bugs! <b>DO NOT</b> set, only when you know why.
* @return Wrapped {@link Callable}
*/
public static <T> TtlCallable<T> get(Callable<T> callable, boolean releaseTtlValueReferenceAfterCall, boolean idempotent) {
@Nullable
public static <T> TtlCallable<T> get(@Nullable Callable<T> callable, boolean releaseTtlValueReferenceAfterCall, boolean idempotent) {
if (null == callable) {
return null;
}
......@@ -137,7 +142,8 @@ public final class TtlCallable<V> implements Callable<V> {
* @param tasks task to be wrapped
* @return Wrapped {@link Callable}
*/
public static <T> List<TtlCallable<T>> gets(Collection<? extends Callable<T>> tasks) {
@Nonnull
public static <T> List<TtlCallable<T>> gets(@Nullable Collection<? extends Callable<T>> tasks) {
return gets(tasks, false, false);
}
......@@ -148,7 +154,8 @@ public final class TtlCallable<V> implements Callable<V> {
* @param releaseTtlValueReferenceAfterCall release TTL value reference after run, avoid memory leak even if {@link TtlRunnable} is referred.
* @return Wrapped {@link Callable}
*/
public static <T> List<TtlCallable<T>> gets(Collection<? extends Callable<T>> tasks, boolean releaseTtlValueReferenceAfterCall) {
@Nonnull
public static <T> List<TtlCallable<T>> gets(@Nullable Collection<? extends Callable<T>> tasks, boolean releaseTtlValueReferenceAfterCall) {
return gets(tasks, releaseTtlValueReferenceAfterCall, false);
}
......@@ -160,7 +167,8 @@ public final class TtlCallable<V> implements Callable<V> {
* @param idempotent is idempotent or not. {@code true} will cover up bugs! <b>DO NOT</b> set, only when you know why.
* @return Wrapped {@link Callable}
*/
public static <T> List<TtlCallable<T>> gets(Collection<? extends Callable<T>> tasks, boolean releaseTtlValueReferenceAfterCall, boolean idempotent) {
@Nonnull
public static <T> List<TtlCallable<T>> gets(@Nullable Collection<? extends Callable<T>> tasks, boolean releaseTtlValueReferenceAfterCall, boolean idempotent) {
if (null == tasks) {
return Collections.emptyList();
}
......
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<Object>(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<TtlRunnable> gets(Collection<? extends Runnable> tasks) {
@Nonnull
public static List<TtlRunnable> gets(@Nullable Collection<? extends Runnable> 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<TtlRunnable> gets(Collection<? extends Runnable> tasks, boolean releaseTtlValueReferenceAfterRun) {
@Nonnull
public static List<TtlRunnable> gets(@Nullable Collection<? extends Runnable> 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<TtlRunnable> gets(Collection<? extends Runnable> tasks, boolean releaseTtlValueReferenceAfterRun, boolean idempotent) {
@Nonnull
public static List<TtlRunnable> gets(@Nullable Collection<? extends Runnable> tasks, boolean releaseTtlValueReferenceAfterRun, boolean idempotent) {
if (null == tasks) {
return Collections.emptyList();
}
......
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<Object>(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! <b>DO NOT</b> 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;
}
......
......@@ -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<Runnable> 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 <T> Future<T> submit(Callable<T> task) {
public <T> Future<T> submit(@Nonnull Callable<T> task) {
return executorService.submit(TtlCallable.get(task));
}
@Nonnull
@Override
public <T> Future<T> submit(Runnable task, T result) {
public <T> Future<T> 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 <T> List<Future<T>> invokeAll(Collection<? extends Callable<T>> tasks) throws InterruptedException {
public <T> List<Future<T>> invokeAll(@Nonnull Collection<? extends Callable<T>> tasks) throws InterruptedException {
return executorService.invokeAll(TtlCallable.gets(tasks));
}
@Nonnull
@Override
public <T> List<Future<T>> invokeAll(Collection<? extends Callable<T>> tasks, long timeout, TimeUnit unit) throws InterruptedException {
public <T> List<Future<T>> invokeAll(@Nonnull Collection<? extends Callable<T>> tasks, long timeout, @Nonnull TimeUnit unit) throws InterruptedException {
return executorService.invokeAll(TtlCallable.gets(tasks), timeout, unit);
}
@Nonnull
@Override
public <T> T invokeAny(Collection<? extends Callable<T>> tasks) throws InterruptedException, ExecutionException {
public <T> T invokeAny(@Nonnull Collection<? extends Callable<T>> tasks) throws InterruptedException, ExecutionException {
return executorService.invokeAny(TtlCallable.gets(tasks));
}
@Override
public <T> T invokeAny(Collection<? extends Callable<T>> tasks, long timeout, TimeUnit unit) throws InterruptedException, ExecutionException, TimeoutException {
public <T> T invokeAny(@Nonnull Collection<? extends Callable<T>> 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;
......
......@@ -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;
}
......
......@@ -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 <V> ScheduledFuture<V> schedule(Callable<V> callable, long delay, TimeUnit unit) {
public <V> ScheduledFuture<V> schedule(@Nonnull Callable<V> 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;
}
......
......@@ -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 <T extends Executor> boolean isTtlWrapper(T executor) {
public static <T extends Executor> 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 extends Executor> T unwrap(T executor) {
public static <T extends Executor> T unwrap(@Nullable T executor) {
if (!isTtlWrapper(executor)) return executor;
return (T) ((ExecutorTtlWrapper) executor).unwrap();
......
......@@ -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<String, String> kvs = splitCommaColonStringToKV(agentArgs);
Logger.setLoggerImplType(getLogImplTypeFromAgentArgs(kvs));
......@@ -119,13 +121,13 @@ public final class TtlAgent {
}
}
private static String getLogImplTypeFromAgentArgs(final Map<String, String> kvs) {
private static String getLogImplTypeFromAgentArgs(@Nonnull final Map<String, String> 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<String, String> kvs) {
private static boolean enableTimerTask(@Nonnull final Map<String, String> 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<String, String> splitCommaColonStringToKV(String commaColonString) {
@Nonnull
static Map<String, String> splitCommaColonStringToKV(@Nullable String commaColonString) {
Map<String, String> ret = new HashMap<String, String>();
if (commaColonString == null || commaColonString.trim().length() == 0) return ret;
......
......@@ -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.
......
......@@ -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!
......
......@@ -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.
......
......@@ -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())
......
......@@ -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)
}
......
......@@ -235,7 +235,7 @@ class ScheduledExecutorServiceTtlWrapperTest {
it.setKeepAliveTime(10, TimeUnit.SECONDS)
expandThreadPool(it)
TtlExecutors.getTtlScheduledExecutorService(it)
}
}!!
@AfterClass
@Suppress("unused")
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册