我们在请求级的Web应用程序中使用InheritableThreadLocal
来存储在整个应用程序中使用的ApplicationContext
对象。
对于异步响应,存在一种情况,其中请求创建确认ID并启动子线程,然后将确认ID返回。最后,ThreadLocal
被删除。
但是,如果子线程运行的时间长于处理请求所花费的时间,则该子线程似乎会丢失ApplicationContext(为null)。
伪代码:
doPost() {
ApplicationContext ctx = createApplicationContext(req);
MyThreadLocalContainer.setContext(ctx);
new Thread(new RequestProcessor()).start(); // this seems to lose the ctx
MyThreadLocalContainer.removeContext();
}
MyThreadLocalContainer的定义:
public class MyThreadLocalContainer {
private static final ThreadLocal<ApplicationContext> APP_CTX = new InheritableThreadLocal<ApplicationContext>();
public static void setContext(ApplicationContext ctx) {
APP_CTX.set(ctx);
}
public static void removeContext() {
APP_CTX.remove();
}
}
在这种情况下如何处理ThreadLocal
清理而不必在调用removeContext()
之前等待子线程完成?