Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
阿啄debugIT
transmittable-thread-local
提交
f598e795
T
transmittable-thread-local
项目概览
阿啄debugIT
/
transmittable-thread-local
与 Fork 源项目一致
从无法访问的项目Fork
通知
8
Star
0
Fork
0
代码
文件
提交
分支
Tags
贡献者
分支图
Diff
Issue
0
列表
看板
标记
里程碑
合并请求
0
Wiki
0
Wiki
分析
仓库
DevOps
项目成员
Pages
T
transmittable-thread-local
项目概览
项目概览
详情
发布
仓库
仓库
文件
提交
分支
标签
贡献者
分支图
比较
Issue
0
Issue
0
列表
看板
标记
里程碑
合并请求
0
合并请求
0
Pages
分析
分析
仓库分析
DevOps
Wiki
0
Wiki
成员
成员
收起侧边栏
关闭侧边栏
动态
分支图
创建新Issue
提交
Issue看板
前往新版Gitcode,体验更适合开发者的 AI 搜索 >>
提交
f598e795
编写于
9月 28, 2018
作者:
oldratlee
🔥
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
JSR 305 intergration #101
上级
7d3c6dd1
变更
19
隐藏空白更改
内联
并排
Showing
19 changed file
with
125 addition
and
61 deletion
+125
-61
appveyor.yml
appveyor.yml
+1
-1
pom.xml
pom.xml
+6
-0
pom4ide.xml
pom4ide.xml
+6
-0
scripts/common.sh
scripts/common.sh
+2
-2
src/main/java/com/alibaba/ttl/TransmittableThreadLocal.java
src/main/java/com/alibaba/ttl/TransmittableThreadLocal.java
+9
-5
src/main/java/com/alibaba/ttl/TtlCallable.java
src/main/java/com/alibaba/ttl/TtlCallable.java
+14
-6
src/main/java/com/alibaba/ttl/TtlRunnable.java
src/main/java/com/alibaba/ttl/TtlRunnable.java
+16
-7
src/main/java/com/alibaba/ttl/TtlTimerTask.java
src/main/java/com/alibaba/ttl/TtlTimerTask.java
+10
-4
src/main/java/com/alibaba/ttl/threadpool/ExecutorServiceTtlWrapper.java
...com/alibaba/ttl/threadpool/ExecutorServiceTtlWrapper.java
+18
-9
src/main/java/com/alibaba/ttl/threadpool/ExecutorTtlWrapper.java
...n/java/com/alibaba/ttl/threadpool/ExecutorTtlWrapper.java
+4
-2
src/main/java/com/alibaba/ttl/threadpool/ScheduledExecutorServiceTtlWrapper.java
...ba/ttl/threadpool/ScheduledExecutorServiceTtlWrapper.java
+11
-5
src/main/java/com/alibaba/ttl/threadpool/TtlExecutors.java
src/main/java/com/alibaba/ttl/threadpool/TtlExecutors.java
+10
-5
src/main/java/com/alibaba/ttl/threadpool/agent/TtlAgent.java
src/main/java/com/alibaba/ttl/threadpool/agent/TtlAgent.java
+7
-4
src/main/java/com/alibaba/ttl/threadpool/agent/TtlTransformer.java
...java/com/alibaba/ttl/threadpool/agent/TtlTransformer.java
+3
-1
src/test/java/com/alibaba/demo/distributed_tracer/refcount/DistributedTracerUseDemo.kt
...o/distributed_tracer/refcount/DistributedTracerUseDemo.kt
+3
-5
src/test/java/com/alibaba/demo/distributed_tracer/weakref/DistributedTracerUseDemo_WeakReferenceInsteadOfRefCounter.kt
...tributedTracerUseDemo_WeakReferenceInsteadOfRefCounter.kt
+1
-1
src/test/java/com/alibaba/ttl/TtlCallableTest.kt
src/test/java/com/alibaba/ttl/TtlCallableTest.kt
+1
-1
src/test/java/com/alibaba/ttl/TtlRunnableTest.kt
src/test/java/com/alibaba/ttl/TtlRunnableTest.kt
+2
-2
src/test/java/com/alibaba/ttl/threadpool/ScheduledExecutorServiceTtlWrapperTest.kt
.../ttl/threadpool/ScheduledExecutorServiceTtlWrapperTest.kt
+1
-1
未找到文件。
appveyor.yml
浏览文件 @
f598e795
...
...
@@ -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
...
...
pom.xml
浏览文件 @
f598e795
...
...
@@ -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>
...
...
pom4ide.xml
浏览文件 @
f598e795
...
...
@@ -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>
...
...
scripts/common.sh
浏览文件 @
f598e795
...
...
@@ -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
()
{
...
...
src/main/java/com/alibaba/ttl/TransmittableThreadLocal.java
浏览文件 @
f598e795
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
();
...
...
src/main/java/com/alibaba/ttl/TtlCallable.java
浏览文件 @
f598e795
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
();
}
...
...
src/main/java/com/alibaba/ttl/TtlRunnable.java
浏览文件 @
f598e795
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
();
}
...
...
src/main/java/com/alibaba/ttl/TtlTimerTask.java
浏览文件 @
f598e795
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
;
}
...
...
src/main/java/com/alibaba/ttl/threadpool/ExecutorServiceTtlWrapper.java
浏览文件 @
f598e795
...
...
@@ -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
;
...
...
src/main/java/com/alibaba/ttl/threadpool/ExecutorTtlWrapper.java
浏览文件 @
f598e795
...
...
@@ -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
;
}
...
...
src/main/java/com/alibaba/ttl/threadpool/ScheduledExecutorServiceTtlWrapper.java
浏览文件 @
f598e795
...
...
@@ -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
;
}
...
...
src/main/java/com/alibaba/ttl/threadpool/TtlExecutors.java
浏览文件 @
f598e795
...
...
@@ -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
();
...
...
src/main/java/com/alibaba/ttl/threadpool/agent/TtlAgent.java
浏览文件 @
f598e795
...
...
@@ -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
;
...
...
src/main/java/com/alibaba/ttl/threadpool/agent/TtlTransformer.java
浏览文件 @
f598e795
...
...
@@ -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.
...
...
src/test/java/com/alibaba/demo/distributed_tracer/refcount/DistributedTracerUseDemo.kt
浏览文件 @
f598e795
...
...
@@ -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!
...
...
src/test/java/com/alibaba/demo/distributed_tracer/weakref/DistributedTracerUseDemo_WeakReferenceInsteadOfRefCounter.kt
浏览文件 @
f598e795
...
...
@@ -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.
...
...
src/test/java/com/alibaba/ttl/TtlCallableTest.kt
浏览文件 @
f598e795
...
...
@@ -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
())
...
...
src/test/java/com/alibaba/ttl/TtlRunnableTest.kt
浏览文件 @
f598e795
...
...
@@ -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
)
}
...
...
src/test/java/com/alibaba/ttl/threadpool/ScheduledExecutorServiceTtlWrapperTest.kt
浏览文件 @
f598e795
...
...
@@ -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.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录