1
我有一個Web應用程序(使用Spring和vaadin)是我需要創建一個輔助線程做一些工作(我不能這樣做,因爲現有代碼這個法子我不能變)。在這個線程中,我需要訪問會話。我發現這個有用的答案:
Accessing scoped proxy beans within Threads of
一切都很好,但線程開始後,當我嘗試獲得會話我得到空。我仍然得到會話ID,但...傳遞RequestAttributes到新的線程會後丟失
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;
}
}
任何想法?
但是不應該ServletRequestAttributes保留它嗎?我也考慮過存儲會話,但是如何在請求中設置它?我想避免使用反射並將所有屬性複製到新創建的會話對象。 – calin