Java 使主线程等待上下文被子线程复制
我正在进行一个流程,该流程执行以下任务:Java 使主线程等待上下文被子线程复制,java,multithreading,spring-boot,Java,Multithreading,Spring Boot,我正在进行一个流程,该流程执行以下任务: 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
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类
private static final ThreadLocal<CountryContextProvider> CONTEXT = new ThreadLocal<>();
public static void clear() {
CONTEXT.clear();
}
private static final ThreadLocal CONTEXT=new ThreadLocal();
公共静态无效清除(){
CONTEXT.clear();
}
我面临的问题是,在子线程可以使用ContextProvider=ContextProvider.getContext()复制它之前,父线程在上下文上调用clear强>
如何确保子线程能够在父线程调用清除之前获取上下文。此外,我不能让主线程等待子线程,使用Async的关键是允许子线程独立执行。您可以而且应该做的是从父线程中删除上下文清除操作,并将其委托给子线程本身。您可以编写AsyncTaskDecorator,如下所示
public class AsyncTaskDecorator implements TaskDecorator {
public Runnable decorate(Runnable runnable) {
return () -> {
try {
ContextProvider provider = ContextProvider.getContext();
// Use it here
} finally {
ContextProvider.getContext().clear();
}
};
}
}
不能这样做,因为我们不能假设在非异步部分中没有异常。如果在调用async之前有任何异常,则永远不会清除上下文