我有一个Web应用程序(使用spring和vaadin)我需要创建一个辅助线程来做一些工作(我不能这样做,因为我无法改变的现有代码)。在这个线程中,我需要访问会话。我找到了这个有用的答案:
Accessing scoped proxy beans within Threads of
一切都很好但是在线程启动后,当我尝试获取会话时,我得到null。我仍然得到会话ID ...
public RequestAwareRunnable() {
this.requestAttributes = RequestContextHolder.getRequestAttributes();
this.thread = Thread.currentThread();
String sessionID = requestAttributes.getSessionId();
HttpSession session = ((ServletRequestAttributes) requestAttributes).getRequest().getSession(false);//the session is OK
}
public void run() {
try {
String sessionID = requestAttributes.getSessionId();
HttpSession session = ((ServletRequestAttributes) requestAttributes).getRequest().getSession(false); // i get null
RequestContextHolder.setRequestAttributes(requestAttributes);
onRun();
} finally {
if (Thread.currentThread() != thread) {
RequestContextHolder.resetRequestAttributes();
}
thread = null;
}
}
有什么想法吗?
答案 0 :(得分:2)
在构造函数中获取会话并将其保存在实例变量中,Session和Request对象是线程绑定的,如果在与处理原始请求的线程不同的线程中执行runnable,则无法访问它们