看一場戲,聽一場雨,真是有趣。
主角之一:主線程緩存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精髓,學而時習之,不亦說乎。另外線程緩存,可用但是慎思慎用。