-
Notifications
You must be signed in to change notification settings - Fork 1.7k
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
这个库带来怎样的好处和优势? #128
Comments
@wilddylan 好问题 ❤️ 文档中没正面说明,需要直接说明出来。 :) 回答一个方案『好处』和『优势』时,要说明的是『 解决一个问题(场景) 的 另一其它方案 的 对比』。 1. 关于 解决的问题/场景简单地说:异步执行上下文的传递; 2. 其它解决方案解决『异步执行上下文的传递』,朴素直接的实现方案 是 下面的示例代码。 import java.util.HashMap;
import java.util.Map;
public class Demo {
public static void main(String[] args) {
// 1. *业务逻辑*需要做的实现逻辑:获取当前上下文
final Map<String, String> context = getContext();
// 2. *业务逻辑*需要做的实现逻辑:捕捉上下文
Map<String, String> contextCopy = new HashMap<>(context);
Runnable asyncLogic = () -> {
// 在异步执行逻辑中,
// 3. 传递,通过 Lambda的外部变量 contextCopy
// 4. 使用上下文
System.out.println(contextCopy);
};
new Thread(asyncLogic).start();
}
private static Map<String, String> getContext() {
return contextHolder.get();
}
// 使用 ThreadLocal:
// - 可以 不同的线程(如执行不同的请求用户的处理) 有自己的Context。
// - 避免 Context 总是通过 函数参数 传递,中间路过的业务的逻辑 都关注/感知 框架的上下文
private static final ThreadLocal<Map<String, String>> contextHolder = ThreadLocal.withInitial(HashMap::new);
} 这样做法的问题从 业务使用 角度来看
从 整体流程实现 角度来看上下文传递流程的规范化:
3. 对比好处和优势 对应的就是 上面的问题解决了,即做到: 透明/自动完成所有异步执行上下文的可定制、规范化的捕捉/传递。基于示例代码说明如下: import com.alibaba.ttl.TransmittableThreadLocal;
import com.alibaba.ttl.threadpool.TtlExecutors;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
public class Demo {
public static void main(String[] args) {
// # 从 业务使用 角度来看 #
//
// 1. 关于『繁琐』:
// 无需关注上下文的传递(由库接管完成)。
// 自然无需 业务逻辑自己 知道 有哪些上下文、分别要如何获取,并一个一个去捕捉/传递。
// 2. 关于『依赖』:
// 业务逻辑直接使用 TTL,不会依赖 不同 上下文获取的逻辑/类。
// 3. 关于『静态(易漏)』
// 由库接管完成 *所有* 上下文的传递,非静态 自动感知新加的上下文。
// 4. 关于『定制性』:
// 提供了`copy`方法,
// 由框架本身(即上下文的提供者)定制好了『上下文的传递方式』,业务逻辑无需感知。
//
// # 从 整体流程实现 角度来看 #
//
// 1. 上下文传递流程的规范化
// 上下文生命周期的操作 从业务逻辑中 分离出来,
// 由库接管完成,业务逻辑无需感知。不会有生命周期相关 *屡见不鲜*的 Bug!
Runnable asyncLogic = () -> {
// 传递,在异步执行逻辑中,使用上下文
System.out.println(contextHolder1.get());
System.out.println(contextHolder2.get());
};
executorService.submit(asyncLogic);
}
private static final TransmittableThreadLocal<String> contextHolder1 = new TransmittableThreadLocal<String>();
private static final TransmittableThreadLocal<Node> contextHolder2 = new TransmittableThreadLocal<Node>() {
@Override
protected Node copy(Node parentValue) {
return new Node(parentValue.id); // 定制传递方式
}
@Override
protected Node initialValue() {
return new Node("1");
}
};
private static class Node {
final String id;
public Node(String id) {
this.id = id;
}
@Override
public String toString() {
return "Node{id='" + id + '\'' + '}';
}
}
private static final ExecutorService executorService = TtlExecutors.getTtlExecutorService(Executors.newCachedThreadPool());
} @wilddylan 你看看,我说的明白不? 不清楚,继续交流。 另外,推荐看一下 issue |
很棒唉 ~ 嘿嘿,为你点赞,快给我一个你加密的工号,我去给你点赞! |
噗~ 直接用我的id PS: 这个 |
Closed. 欢迎 大家在这个 issue 继续讨论 ❤️ |
No description provided.
The text was updated successfully, but these errors were encountered: