Skip to content

Commit

Permalink
rename project for code
Browse files Browse the repository at this point in the history
  • Loading branch information
oldratlee committed Feb 14, 2016
1 parent b46a14b commit b6032c1
Show file tree
Hide file tree
Showing 63 changed files with 1,491 additions and 1,486 deletions.
64 changes: 32 additions & 32 deletions README-EN.md
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
multi-thread context(MTC)
Transmittable ThreadLocal(`TTL`)
=====================================

[![Build Status](https://travis-ci.org/alibaba/multi-thread-context.svg?branch=master)](https://travis-ci.org/alibaba/multi-thread-context)
Expand Down Expand Up @@ -29,7 +29,7 @@ If you have problem or question, please [submit Issue](https://github.com/alibab
:art: Requirements
----------------------------

The Requirements listed below is also why I sort out `MTC` in my work.
The Requirements listed below is also why I sort out `TTL` in my work.

* Application container or high layer framework transmit information to low layer sdk.
* Transmit context to logging without application code aware.
Expand All @@ -42,7 +42,7 @@ The Requirements listed below is also why I sort out `MTC` in my work.

```java
// set in parent thread
MtContextThreadLocal<String> parent = new MtContextThreadLocal<String>();
TransmittableThreadLocal<String> parent = new TransmittableThreadLocal<String>();
parent.set("value-set-in-parent");

// =====================================================
Expand All @@ -63,19 +63,19 @@ The solution is below usage.

### 2.1 Decorate `Runnable` and `Callable`

Decorate input `Runnable` and `Callable` by [`com.alibaba.mtc.MtContextRunnable`](src/main/java/com/alibaba/mtc/MtContextRunnable.java)
and [`com.alibaba.mtc.MtContextCallable`](src/main/java/com/alibaba/mtc/MtContextCallable.java).
Decorate input `Runnable` and `Callable` by [`com.alibaba.ttl.TtlRunnable`](/src/main/java/com/alibaba/ttl/TtlRunnable.java)
and [`com.alibaba.ttl.TtlCallable`](src/main/java/com/alibaba/ttl/TtlCallable.java).

Sample code:

```java
MtContextThreadLocal<String> parent = new MtContextThreadLocal<String>();
TransmittableThreadLocal<String> parent = new TransmittableThreadLocal<String>();
parent.set("value-set-in-parent");

Runnable task = new Task("1");
// extra work, create decorated mtContextRunnable object
Runnable mtContextRunnable = MtContextRunnable.get(task);
executorService.submit(mtContextRunnable);
// extra work, create decorated ttlRunnable object
Runnable ttlRunnable = TtlRunnable.get(task);
executorService.submit(ttlRunnable);

// =====================================================

Expand All @@ -86,13 +86,13 @@ String value = parent.get();
above code show how to dealing with `Runnable`, `Callable` is similar:

```java
MtContextThreadLocal<String> parent = new MtContextThreadLocal<String>();
TransmittableThreadLocal<String> parent = new TransmittableThreadLocal<String>();
parent.set("value-set-in-parent");

Callable call = new Call("1");
// extra work, create decorated mtContextCallable object
Callable mtContextCallable = MtContextCallable.get(call);
executorService.submit(mtContextCallable);
// extra work, create decorated ttlCallable object
Callable ttlCallable = TtlCallable.get(call);
executorService.submit(ttlCallable);

// =====================================================

Expand All @@ -105,23 +105,23 @@ String value = parent.get();
Eliminating the work of `Runnable` and `Callable` Decoration every time it is submitted to thread pool. This work can completed in the thread pool.

Use util class
[`com.alibaba.mtc.threadpool.MtContextExecutors`](src/main/java/com/alibaba/mtc/threadpool/MtContextExecutors.java)
[`com.alibaba.ttl.threadpool.TtlExecutors`](src/main/java/com/alibaba/ttl/threadpool/TtlExecutors.java)
to decorate thread pool.

Util class `com.alibaba.mtc.threadpool.MtContextExecutors` has below methods:
Util class `com.alibaba.ttl.threadpool.TtlExecutors` has below methods:

* `getMtcExecutor`: decorate interface `Executor`
* `getMtcExecutorService`: decorate interface `ExecutorService`
* `getTtlExecutor`: decorate interface `Executor`
* `getTtlExecutorService`: decorate interface `ExecutorService`
* `ScheduledExecutorService`: decorate interface `ScheduledExecutorService`

Sample code:

```java
ExecutorService executorService = ...
// extra work, create decorated executorService object
executorService = MtContextExecutors.getMtcExecutorService(executorService);
executorService = TtlExecutors.getTtlExecutorService(executorService);

MtContextThreadLocal<String> parent = new MtContextThreadLocal<String>();
TransmittableThreadLocal<String> parent = new TransmittableThreadLocal<String>();
parent.set("value-set-in-parent");

Runnable task = new Task("1");
Expand All @@ -137,7 +137,7 @@ String value = parent.get();

### 2.3. Use Java Agent to decorate thread pool implementation class

In this usage, `MtContext` transmission is transparent\(no decoration operation\).
In this usage, `TTL Context` transmission is transparent\(no decoration operation\).

Sample code:

Expand All @@ -155,31 +155,31 @@ executorService.submit(call);
String value = parent.get();
```

See demo [`AgentDemo.java`](src/test/java/com/alibaba/mtc/threadpool/agent/AgentDemo.java).
See demo [`AgentDemo.java`](src/test/java/com/alibaba/ttl/threadpool/agent/AgentDemo.java).

Agent decorate 2 thread pool implementation classes
\(implementation code [`MtContextTransformer.java`](src/main/java/com/alibaba/mtc/threadpool/agent/MtContextTransformer.java)\):
\(implementation code [`TtlTransformer.java`](src/main/java/com/alibaba/ttl/threadpool/agent/TtlTransformer.java)\):

- `java.util.concurrent.ThreadPoolExecutor`
- `java.util.concurrent.ScheduledThreadPoolExecutor`

Add start options on Java command:

- `-Xbootclasspath/a:/path/to/multithread.context-x.y.z.jar:/path/to/javassist-3.12.1.GA.jar`
- `-javaagent:/path/to/multithread.context-x.y.z.jar`
- `-Xbootclasspath/a:/path/to/transmittable-thread-local-2.x.x.jar`
- `-javaagent:/path/to/transmittable-thread-local-2.x.x.jar`

**NOTE**

* Agent modify the jdk classes, add code refer to the class of `MTC`, so the jar of `MTC Agent` should add to `bootclasspath`.
* `MTC Agent` modify the class by `javassist`, so the Jar of `javassist` should add to `bootclasspath` too.
* Agent modify the jdk classes, add code refer to the class of `TTL`, so the jar of `TTL Agent` should add to `bootclasspath`.
* `TTL Agent` modify the class by `javassist`, so the Jar of `javassist` should add to `bootclasspath` too.

Java command example:

```bash
java -Xbootclasspath/a:dependency/javassist-3.12.1.GA.jar:multithread.context-1.0.0.jar \
-javaagent:multithread.context-0.9.0-SNAPSHOT.jar \
java -Xbootclasspath/a:transmittable-thread-local-2.0.0.jar \
-javaagent:transmittable-thread-local-2.0.0.jar \
-cp classes \
com.alibaba.mtc.threadpool.agent.AgentDemo
com.alibaba.ttl.threadpool.agent.demo.AgentDemo
```

Run the script [`run-agent-demo.sh`](run-agent-demo.sh)
Expand All @@ -196,12 +196,12 @@ The current version Java API documentation: <http://alibaba.github.io/multi-thre
```xml
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>multithread.context</artifactId>
<version>1.2.1</version>
<artifactId>transmittable-thread-local</artifactId>
<version>2.0.0</version>
</dependency>
```

Check available version at [search.maven.org](http://search.maven.org/#search%7Cgav%7C1%7Cg%3A%22com.alibaba%22%20AND%20a%3A%22multithread.context%22).
Check available version at [search.maven.org](http://search.maven.org/#search%7Cgav%7C1%7Cg%3A%22com.alibaba%22%20AND%20a%3A%22transmittable-thread-local%22).

:books: Related resources
=====================================
Expand Down
74 changes: 37 additions & 37 deletions README.md
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
multi-thread context(MTC)
Transmittable ThreadLocal(`TTL`)
=====================================

[![Build Status](https://travis-ci.org/alibaba/multi-thread-context.svg?branch=master)](https://travis-ci.org/alibaba/multi-thread-context)
Expand Down Expand Up @@ -46,9 +46,9 @@ multi-thread context(MTC)

`App Engine`的日志(如,`SDK`会记录日志)要记录系统上下文。由于不限制用户应用使用线程池,系统的上下文需要能跨线程的传递,且不影响应用代码。

### 上面场景使用`MTC`的整体构架
### 上面场景使用`TTL`的整体构架

<img src="docs/mtc-arch.png" alt="构架图" width="260" />
<img src="docs/TransmittableThreadLocal-arch.png" alt="构架图" width="260" />

构架涉及3个角色:容器、用户应用、`SDK`

Expand All @@ -65,9 +65,9 @@ multi-thread context(MTC)
:notebook: User Guide
=====================================

使用类[`MtContextThreadLocal`](src/main/java/com/alibaba/mtc/MtContextThreadLocal.java)来保存上下文,并跨线程池传递。
使用类[`TransmittableThreadLocal`](src/main/java/com/alibaba/ttl/TransmittableThreadLocal.java)来保存上下文,并跨线程池传递。

[`MtContextThreadLocal`](src/main/java/com/alibaba/mtc/MtContextThreadLocal.java)继承[`java.lang.InheritableThreadLocal`](http://docs.oracle.com/javase/6/docs/api/java/lang/InheritableThreadLocal.html),使用方式也类似。
[`TransmittableThreadLocal`](src/main/java/com/alibaba/ttl/TransmittableThreadLocal.java)继承[`java.lang.InheritableThreadLocal`](http://docs.oracle.com/javase/6/docs/api/java/lang/InheritableThreadLocal.html),使用方式也类似。

[`java.lang.InheritableThreadLocal`](http://docs.oracle.com/javase/6/docs/api/java/lang/InheritableThreadLocal.html),添加了`protected`方法`copy`,用于定制 **任务提交给线程池时**的上下文传递到 **任务执行时**时的拷贝行为,缺省是传递的是引用。

Expand All @@ -82,7 +82,7 @@ multi-thread context(MTC)

```java
// 在父线程中设置
MtContextThreadLocal<String> parent = new MtContextThreadLocal<String>();
TransmittableThreadLocal<String> parent = new TransmittableThreadLocal<String>();
parent.set("value-set-in-parent");

// =====================================================
Expand All @@ -103,18 +103,18 @@ String value = parent.get();

### 2.1 修饰`Runnable``Callable`

使用[`com.alibaba.mtc.MtContextRunnable`](src/main/java/com/alibaba/mtc/MtContextRunnable.java)[`com.alibaba.mtc.MtContextCallable`](src/main/java/com/alibaba/mtc/MtContextCallable.java)来修饰传入线程池的`Runnable``Callable`
使用[`com.alibaba.ttl.TtlRunnable`](src/main/java/com/alibaba/ttl/TtlRunnable.java)[`com.alibaba.ttl.TtlCallable`](src/main/java/com/alibaba/ttl/TtlCallable.java)来修饰传入线程池的`Runnable``Callable`

示例代码:

```java
MtContextThreadLocal<String> parent = new MtContextThreadLocal<String>();
TransmittableThreadLocal<String> parent = new TransmittableThreadLocal<String>();
parent.set("value-set-in-parent");

Runnable task = new Task("1");
// 额外的处理,生成修饰了的对象mtContextRunnable
Runnable mtContextRunnable = MtContextRunnable.get(task);
executorService.submit(mtContextRunnable);
// 额外的处理,生成修饰了的对象ttlRunnable
Runnable ttlRunnable = TtlRunnable.get(task);
executorService.submit(ttlRunnable);

// =====================================================

Expand All @@ -125,13 +125,13 @@ String value = parent.get();
上面演示了`Runnable``Callable`的处理类似

```java
MtContextThreadLocal<String> parent = new MtContextThreadLocal<String>();
TransmittableThreadLocal<String> parent = new TransmittableThreadLocal<String>();
parent.set("value-set-in-parent");

Callable call = new Call("1");
// 额外的处理,生成修饰了的对象mtContextCallable
Callable mtContextCallable = MtContextCallable.get(call);
executorService.submit(mtContextCallable);
// 额外的处理,生成修饰了的对象ttlCallable
Callable ttlCallable = TtlCallable.get(call);
executorService.submit(ttlCallable);

// =====================================================

Expand All @@ -141,26 +141,26 @@ String value = parent.get();

#### 这种使用方式的时序图

<img src="docs/mtc-sequence-diagram.png" alt="时序图" width="600" />
<img src="docs/TransmittableThreadLocal-sequence-diagram.png" alt="时序图" width="600" />

### 2.2 修饰线程池

省去每次`Runnable``Callable`传入线程池时的修饰,这个逻辑可以在线程池中完成。

通过工具类[`com.alibaba.mtc.threadpool.MtContextExecutors`](src/main/java/com/alibaba/mtc/threadpool/MtContextExecutors.java)完成,有下面的方法:
通过工具类[`com.alibaba.ttl.threadpool.TtlExecutors`](src/main/java/com/alibaba/ttl/threadpool/TtlExecutors.java)完成,有下面的方法:

* `getMtcExecutor`:修饰接口`Executor`
* `getMtcExecutorService`:修饰接口`ExecutorService`
* `getTtlExecutor`:修饰接口`Executor`
* `getTtlExecutorService`:修饰接口`ExecutorService`
* `ScheduledExecutorService`:修饰接口`ScheduledExecutorService`

示例代码:

```java
ExecutorService executorService = ...
// 额外的处理,生成修饰了的对象executorService
executorService = MtContextExecutors.getMtcExecutorService(executorService);
executorService = TtlExecutors.getTtlExecutorService(executorService);

MtContextThreadLocal<String> parent = new MtContextThreadLocal<String>();
TransmittableThreadLocal<String> parent = new TransmittableThreadLocal<String>();
parent.set("value-set-in-parent");

Runnable task = new Task("1");
Expand All @@ -176,14 +176,14 @@ String value = parent.get();

### 2.3 使用Java Agent来修饰JDK线程池实现类

这种方式,实现线程池的`MtContext`传递过程中,代码中没有修饰`Runnble`或是线程池的代码。
这种方式,实现线程池的`TTL Context`传递过程中,代码中没有修饰`Runnble`或是线程池的代码。
\# 即可以做到应用代码 **无侵入**,后面文档有结合实际场景的架构对这一点的说明。

示例代码:

```java
// 框架代码
MtContextThreadLocal<String> parent = new MtContextThreadLocal<String>();
TransmittableThreadLocal<String> parent = new TransmittableThreadLocal<String>();
parent.set("value-set-in-parent");

// 应用代码
Expand All @@ -200,41 +200,41 @@ executorService.submit(call);
String value = parent.get();
```

Demo参见[`AgentDemo.java`](src/test/java/com/alibaba/mtc/threadpool/agent/demo/AgentDemo.java)
Demo参见[`AgentDemo.java`](src/test/java/com/alibaba/ttl/threadpool/agent/demo/AgentDemo.java)

目前Agent中,修饰了`jdk`中的两个线程池实现类(实现代码在[`MtContextTransformer.java`](src/main/java/com/alibaba/mtc/threadpool/agent/MtContextTransformer.java)):
目前Agent中,修饰了`jdk`中的两个线程池实现类(实现代码在[`TtlTransformer.java`](src/main/java/com/alibaba/ttl/threadpool/agent/TtlTransformer.java)):

- `java.util.concurrent.ThreadPoolExecutor`
- `java.util.concurrent.ScheduledThreadPoolExecutor`

`Java`的启动参数加上:

- `-Xbootclasspath/a:/path/to/multithread.context-1.1.0.jar`
- `-javaagent:/path/to/multithread.context-1.1.0.jar`
- `-Xbootclasspath/a:/path/to/transmittable-thread-local-2.x.x.jar`
- `-javaagent:/path/to/transmittable-thread-local-2.x.x.jar`

**注意**

* Agent修改是JDK的类,类中加入了引用`MTC`的代码,所以`MTC Agent``Jar`要加到`bootclasspath`上。
* Agent修改是JDK的类,类中加入了引用`TTL`的代码,所以`TTL Agent``Jar`要加到`bootclasspath`上。

Java命令行示例如下:

```bash
java -Xbootclasspath/a:multithread.context-1.1.0.jar \
-javaagent:multithread.context-1.1.0-SNAPSHOT.jar \
java -Xbootclasspath/a:transmittable-thread-local-2.0.0.jar \
-javaagent:transmittable-thread-local-2.0.0.jar \
-cp classes \
com.alibaba.mtc.threadpool.agent.demo.AgentDemo
com.alibaba.ttl.threadpool.agent.demo.AgentDemo
```

有Demo演示『使用Java Agent来修饰线程池实现类』,执行工程下的脚本[`run-agent-demo.sh`](run-agent-demo.sh)即可运行Demo。

#### 什么情况下,`Java Agent`的使用方式`MtContext`会失效?
#### 什么情况下,`Java Agent`的使用方式`TTL Context`会失效?

由于`Runnable``Callable`的修饰代码,是在线程池类中插入的。下面的情况会让插入的代码被绕过,`MtContext`会失效。
由于`Runnable``Callable`的修饰代码,是在线程池类中插入的。下面的情况会让插入的代码被绕过,`TTL Context`会失效。

- 用户代码中继承`java.util.concurrent.ThreadPoolExecutor``java.util.concurrent.ScheduledThreadPoolExecutor`
覆盖了`execute``submit``schedule`等提交任务的方法,并且没有调用父类的方法。
修改线程池类的实现,`execute``submit``schedule`等提交任务的方法禁止这些被覆盖,可以规避这个问题。
- 目前,没有修饰`java.util.Timer`类,使用`Timer`时,`MtContext`会有问题。
- 目前,没有修饰`java.util.Timer`类,使用`Timer`时,`TTL Context`会有问题。

:electric_plug: Java API Docs
======================
Expand All @@ -249,12 +249,12 @@ java -Xbootclasspath/a:multithread.context-1.1.0.jar \
```xml
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>multithread.context</artifactId>
<version>1.2.1</version>
<artifactId>transmittable-thread-local</artifactId>
<version>2.0.0</version>
</dependency>
```

可以在 [search.maven.org](http://search.maven.org/#search%7Cgav%7C1%7Cg%3A%22com.alibaba%22%20AND%20a%3A%22multithread.context%22) 查看可用的版本。
可以在 [search.maven.org](http://search.maven.org/#search%7Cgav%7C1%7Cg%3A%22com.alibaba%22%20AND%20a%3A%22transmittable-thread-local%22) 查看可用的版本。

:question: FAQ
=====================================
Expand Down
File renamed without changes
File renamed without changes
File renamed without changes.
File renamed without changes.
Loading

0 comments on commit b6032c1

Please sign in to comment.