看一场戏,听一场雨,真是有趣。
主角之一:主线程缓存ThreadLocal上下文
ThreadLocal<SomeContext> someContext = new ThreadLocal<>();
String someToken = someContext.getToken();
String someAccountNo = someContext.getAccountNo();
主角之二:多线程登场 —— 注意ATask和BTask子线程会新开辟线程上下文,因此子线程内someContext为空
ExecutorService executor = new ThreadPoolExecutor();
ATask = executor.submit(() -> {
aClient.getServive;
}
BTask = executor.submit(() -> {
bClient.getSevrive;
}
if (StringUtil.isNotBlank(someContext.getToken())) {
// 如果还是主线程,someContext不为空,则会进入这个分支
addSomeToken2Message(更好玩的在这里);
} else {
// 如果是子线程,someContext为空,则会进入这个分支
}
主角之三:BeanUtils.copyPropertiesToMap,request为Map类型时,不能Map copy to Map? 还要踩多少坑才肯从入门到放弃?
private void addSomeToken2Message(Object request, SomeMessage someMessage) {
Map<String, Object> requestMap = new HashMap<>(16);
BeanUtils.copyPropertiesToMap(request, "", requestMap);
requestMap.put(Constant.SOME_TOKEN_KEY, someContext.getToken());
transformMessage(...);
}
反思:
- 先把边界理清楚,心态放平别着急,拿到真凭实据,白纸黑字,实事求是,终会守得云开见月明。
- Java功底任何时候都不能落下,多线程是Java精髓,学而时习之,不亦说乎。另外线程缓存,可用但是慎思慎用。