[英]Make main thread wait until the context is copied by child threads
我正在處理執行以下任務的流程:
1.Kafka Consumer consumes kafka message and does some task A
2.It then starts an async process using @Async in spring boot
3.It clears the context and exits
我正在使用 TaskDecorator 將上下文傳遞給 Async
public class AsyncTaskDecorator implements TaskDecorator {
ContextProvider provider = ContextProvider.getContext();
}
下面是我的 ContextProvider class
private static final ThreadLocal<CountryContextProvider> CONTEXT = new ThreadLocal<>();
public static void clear() {
CONTEXT.clear();
}
我面臨的問題是在子線程可以使用ContextProvider provider = ContextProvider.getContext();復制它之前,父線程在上下文上調用 clear
如何確保子線程能夠在父線程調用clear之前獲取上下文。另外,我不能讓主線程等待子線程,使用Async的全部意義在於讓子線程獨立執行。
您可以而且應該做的是從 Parent 中刪除上下文清除操作並將其委托給 Child 本身。 您可以如下編寫 AsyncTaskDecorator;
public class AsyncTaskDecorator implements TaskDecorator {
public Runnable decorate(Runnable runnable) {
return () -> {
try {
ContextProvider provider = ContextProvider.getContext();
// Use it here
} finally {
ContextProvider.getContext().clear();
}
};
}
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.