README-EN.md 10.3 KB
Newer Older
1
Transmittable ThreadLocal(TTL)
oldratlee's avatar
oldratlee 已提交
2 3
=====================================

oldratlee's avatar
oldratlee 已提交
4
[![Build Status](https://travis-ci.org/alibaba/transmittable-thread-local.svg?branch=master)](https://travis-ci.org/alibaba/transmittable-thread-local)
oldratlee's avatar
oldratlee 已提交
5
[![Coverage Status](https://img.shields.io/codecov/c/github/alibaba/transmittable-thread-local/master.svg)](https://codecov.io/gh/alibaba/transmittable-thread-local/branch/master)
oldratlee's avatar
oldratlee 已提交
6
[![Maven Central](https://maven-badges.herokuapp.com/maven-central/com.alibaba/transmittable-thread-local/badge.svg)](https://maven-badges.herokuapp.com/maven-central/com.alibaba/transmittable-thread-local/)
oldratlee's avatar
oldratlee 已提交
7 8
[![GitHub release](https://img.shields.io/github/release/alibaba/transmittable-thread-local.svg)](https://github.com/alibaba/transmittable-thread-local/releases)
[![Dependency Status](https://www.versioneye.com/user/projects/56c0a36218b271002c699dca/badge.svg)](https://www.versioneye.com/user/projects/56c0a36218b271002c699dca)  
T
The Gitter Badger 已提交
9
[![Join the chat at https://gitter.im/alibaba/transmittable-thread-local](https://badges.gitter.im/alibaba/transmittable-thread-local.svg)](https://gitter.im/alibaba/transmittable-thread-local?utm_source=badge&utm_medium=badge&utm_campaign=pr-badge&utm_content=badge)
oldratlee's avatar
oldratlee 已提交
10
[![GitHub issues](https://img.shields.io/github/issues/alibaba/transmittable-thread-local.svg)](https://github.com/alibaba/transmittable-thread-local/issues)
oldratlee's avatar
oldratlee 已提交
11 12
[![Percentage of issues still open](http://isitmaintained.com/badge/open/alibaba/transmittable-thread-local.svg)](http://isitmaintained.com/project/alibaba/transmittable-thread-local "Percentage of issues still open")
[![Average time to resolve an issue](http://isitmaintained.com/badge/resolution/alibaba/transmittable-thread-local.svg)](http://isitmaintained.com/project/alibaba/transmittable-thread-local "Average time to resolve an issue")
oldratlee's avatar
oldratlee 已提交
13
[![License](https://img.shields.io/badge/license-Apache%202-4EB1BA.svg)](https://www.apache.org/licenses/LICENSE-2.0.html)
oldratlee's avatar
oldratlee 已提交
14

oldratlee's avatar
oldratlee 已提交
15
:book: English Documentation | [:book: 中文文档](README.md)
oldratlee's avatar
oldratlee 已提交
16

oldratlee's avatar
oldratlee 已提交
17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42
----------------------------------------

<!-- START doctoc generated TOC please keep comment here to allow auto update -->
<!-- DON'T EDIT THIS SECTION, INSTEAD RE-RUN doctoc TO UPDATE -->


- [:wrench: Functions](#wrench-functions)
- [:art: Requirements](#art-requirements)
- [:busts_in_silhouette: User Guide](#busts_in_silhouette-user-guide)
    - [1. simple usage](#1-simple-usage)
    - [2. Transmit value even using thread pool](#2-transmit-value-even-using-thread-pool)
        - [2.1 Decorate `Runnable` and `Callable`](#21-decorate-runnable-and-callable)
        - [2.2 Decorate thread pool](#22-decorate-thread-pool)
        - [2.3. Use Java Agent to decorate thread pool implementation class](#23-use-java-agent-to-decorate-thread-pool-implementation-class)
- [:electric_plug: Java API Docs](#electric_plug-java-api-docs)
- [:cookie: Maven dependency](#cookie-maven-dependency)
- [:books: Related resources](#books-related-resources)
    - [Jdk core classes](#jdk-core-classes)
    - [Java Agent](#java-agent)
    - [Javassist](#javassist)

<!-- END doctoc generated TOC please keep comment here to allow auto update -->

----------------------------------------

# :wrench: Functions
oldratlee's avatar
oldratlee 已提交
43

44
:point_right: Transmit `ThreadLocal` value between threads, even using thread cached components like thread pool.
oldratlee's avatar
oldratlee 已提交
45

46
Class [`InheritableThreadLocal`](http://docs.oracle.com/javase/7/docs/api/java/lang/InheritableThreadLocal.html) in `JDK`
47
can transmit value to child thread from parent thread.
oldratlee's avatar
oldratlee 已提交
48

49 50
But when use thread pool, thread is cached up and used repeatedly. Transmitting value from parent thread to child thread has no meaning.
Application need transmit value from the time task is created to the time task is executed.
oldratlee's avatar
oldratlee 已提交
51

oldratlee's avatar
oldratlee 已提交
52
If you have problem or question, please [submit Issue](https://github.com/alibaba/transmittable-thread-local/issues) or play [fork](https://github.com/alibaba/transmittable-thread-local/fork) and pull request dance.
oldratlee's avatar
oldratlee 已提交
53

oldratlee's avatar
oldratlee 已提交
54
# :art: Requirements
oldratlee's avatar
oldratlee 已提交
55

56
The Requirements listed below is also why I sort out `TTL` in my work. 
oldratlee's avatar
oldratlee 已提交
57 58 59 60

* Application container or high layer framework transmit information to low layer sdk.
* Transmit context to logging without application code aware.

oldratlee's avatar
oldratlee 已提交
61
# :busts_in_silhouette: User Guide
oldratlee's avatar
oldratlee 已提交
62

oldratlee's avatar
oldratlee 已提交
63
## 1. simple usage
oldratlee's avatar
oldratlee 已提交
64 65 66

```java
// set in parent thread
67
TransmittableThreadLocal<String> parent = new TransmittableThreadLocal<String>();
oldratlee's avatar
oldratlee 已提交
68 69 70 71 72 73 74 75
parent.set("value-set-in-parent");

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

// read in child thread, value is "value-set-in-parent"
String value = parent.get(); 
```

76
This is the function of class [`InheritableThreadLocal`](http://docs.oracle.com/javase/7/docs/api/java/lang/InheritableThreadLocal.html), should use class [`InheritableThreadLocal`](http://docs.oracle.com/javase/7/docs/api/java/lang/InheritableThreadLocal.html) instead.
oldratlee's avatar
oldratlee 已提交
77

78 79
But when use thread pool, thread is cached up and used repeatedly. Transmitting value from parent thread to child thread has no meaning.
Application need transmit value from the time task is created to the point task is executed.
oldratlee's avatar
oldratlee 已提交
80 81 82

The solution is below usage.

oldratlee's avatar
oldratlee 已提交
83
## 2. Transmit value even using thread pool
oldratlee's avatar
oldratlee 已提交
84 85 86

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

87 88
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).
oldratlee's avatar
oldratlee 已提交
89 90 91 92

Sample code:

```java
93
TransmittableThreadLocal<String> parent = new TransmittableThreadLocal<String>();
oldratlee's avatar
oldratlee 已提交
94 95 96
parent.set("value-set-in-parent");

Runnable task = new Task("1");
97 98 99
// extra work, create decorated ttlRunnable object
Runnable ttlRunnable = TtlRunnable.get(task); 
executorService.submit(ttlRunnable);
oldratlee's avatar
oldratlee 已提交
100 101 102 103 104 105 106 107 108 109

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

// read in task, value is "value-set-in-parent"
String value = parent.get(); 
```

above code show how to dealing with `Runnable`, `Callable` is similar:

```java
110
TransmittableThreadLocal<String> parent = new TransmittableThreadLocal<String>();
oldratlee's avatar
oldratlee 已提交
111 112 113
parent.set("value-set-in-parent");

Callable call = new Call("1");
114 115 116
// extra work, create decorated ttlCallable object
Callable ttlCallable = TtlCallable.get(call); 
executorService.submit(ttlCallable);
oldratlee's avatar
oldratlee 已提交
117 118 119 120 121 122 123 124 125 126 127 128

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

// read in call, value is "value-set-in-parent"
String value = parent.get(); 
```

### 2.2 Decorate thread pool

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
129
[`com.alibaba.ttl.threadpool.TtlExecutors`](src/main/java/com/alibaba/ttl/threadpool/TtlExecutors.java)
oldratlee's avatar
oldratlee 已提交
130 131
to decorate thread pool.

132
Util class `com.alibaba.ttl.threadpool.TtlExecutors` has below methods:
oldratlee's avatar
oldratlee 已提交
133

134 135
* `getTtlExecutor`: decorate interface `Executor`
* `getTtlExecutorService`: decorate interface `ExecutorService`
oldratlee's avatar
oldratlee 已提交
136 137 138 139 140 141 142
* `ScheduledExecutorService`: decorate interface `ScheduledExecutorService`

Sample code:

```java
ExecutorService executorService = ...
// extra work, create decorated executorService object
143
executorService = TtlExecutors.getTtlExecutorService(executorService); 
oldratlee's avatar
oldratlee 已提交
144

145
TransmittableThreadLocal<String> parent = new TransmittableThreadLocal<String>();
oldratlee's avatar
oldratlee 已提交
146 147 148 149 150 151 152 153 154 155 156 157 158 159 160
parent.set("value-set-in-parent");

Runnable task = new Task("1");
Callable call = new Call("2");
executorService.submit(task);
executorService.submit(call);

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

// read in Task or Callable, value is "value-set-in-parent"
String value = parent.get(); 
```

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

161
In this usage, transmission is transparent\(no decoration operation\).
oldratlee's avatar
oldratlee 已提交
162 163 164 165 166 167 168 169 170 171 172 173 174

Sample code:

```java
ExecutorService executorService = Executors.newFixedThreadPool(3);

Runnable task = new Task("1");
Callable call = new Call("2");
executorService.submit(task);
executorService.submit(call);

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

oldratlee's avatar
oldratlee 已提交
175
// read in Task or Callable, value is "value-set-in-parent"
oldratlee's avatar
oldratlee 已提交
176 177 178
String value = parent.get();
```

179
See demo [`AgentDemo.java`](src/test/java/com/alibaba/ttl/threadpool/agent/AgentDemo.java).
oldratlee's avatar
oldratlee 已提交
180 181

Agent decorate 2 thread pool implementation classes
182
\(implementation code [`TtlTransformer.java`](src/main/java/com/alibaba/ttl/threadpool/agent/TtlTransformer.java)\):
oldratlee's avatar
oldratlee 已提交
183 184 185 186

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

oldratlee's avatar
oldratlee 已提交
187
Add start options on Java command: 
oldratlee's avatar
oldratlee 已提交
188

189 190
- `-Xbootclasspath/a:/path/to/transmittable-thread-local-2.x.x.jar`
- `-javaagent:/path/to/transmittable-thread-local-2.x.x.jar`
oldratlee's avatar
oldratlee 已提交
191 192 193

**NOTE**

194 195
* 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.
oldratlee's avatar
oldratlee 已提交
196 197 198 199

Java command example:

```bash
200 201
java -Xbootclasspath/a:transmittable-thread-local-2.0.0.jar \
    -javaagent:transmittable-thread-local-2.0.0.jar \
oldratlee's avatar
oldratlee 已提交
202
    -cp classes \
203
    com.alibaba.ttl.threadpool.agent.demo.AgentDemo
oldratlee's avatar
oldratlee 已提交
204 205
```

oldratlee's avatar
oldratlee 已提交
206
Run the script [`run-agent-demo.sh`](run-agent-demo.sh)
oldratlee's avatar
oldratlee 已提交
207 208
to start demo of "Use Java Agent to decorate thread pool implementation class".

oldratlee's avatar
oldratlee 已提交
209
# :electric_plug: Java API Docs
210

oldratlee's avatar
oldratlee 已提交
211
The current version Java API documentation: <http://alibaba.github.io/transmittable-thread-local/apidocs/>
212

oldratlee's avatar
oldratlee 已提交
213
# :cookie: Maven dependency
oldratlee's avatar
oldratlee 已提交
214 215 216 217

```xml
<dependency>
	<groupId>com.alibaba</groupId>
218
	<artifactId>transmittable-thread-local</artifactId>
oldratlee's avatar
oldratlee 已提交
219
	<version>2.1.1</version>
oldratlee's avatar
oldratlee 已提交
220 221 222
</dependency>
```

223
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).
oldratlee's avatar
oldratlee 已提交
224

oldratlee's avatar
oldratlee 已提交
225
# :books: Related resources
oldratlee's avatar
oldratlee 已提交
226

oldratlee's avatar
oldratlee 已提交
227
## Jdk core classes
oldratlee's avatar
oldratlee 已提交
228 229 230 231

* [WeakHashMap](http://docs.oracle.com/javase/7/docs/api/java/util/WeakHashMap.html)
* [InheritableThreadLocal](http://docs.oracle.com/javase/7/docs/api/java/lang/InheritableThreadLocal.html)

oldratlee's avatar
oldratlee 已提交
232
## Java Agent
oldratlee's avatar
oldratlee 已提交
233

oldratlee's avatar
oldratlee 已提交
234
* [Java Agent规范](http://docs.oracle.com/javase/7/docs/api/java/lang/instrument/package-summary.html)
oldratlee's avatar
oldratlee 已提交
235 236 237
* [Java SE 6 新特性: Instrumentation 新功能](http://www.ibm.com/developerworks/cn/java/j-lo-jse61/)
* [Creation, dynamic loading and instrumentation with javaagents](http://dhruba.name/2010/02/07/creation-dynamic-loading-and-instrumentation-with-javaagents/)
* [JavaAgent加载机制分析](http://alipaymiddleware.com/jvm/javaagent%E5%8A%A0%E8%BD%BD%E6%9C%BA%E5%88%B6%E5%88%86%E6%9E%90/)
oldratlee's avatar
oldratlee 已提交
238

oldratlee's avatar
oldratlee 已提交
239
## Javassist
oldratlee's avatar
oldratlee 已提交
240

oldratlee's avatar
oldratlee 已提交
241
* [Getting Started with Javassist](http://www.csg.ci.i.u-tokyo.ac.jp/~chiba/javassist/tutorial/tutorial.html)