2012-10-16 43 views
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; 
    } 
} 

任何想法?

回答

2

獲取在構造了會議,並保存在一個實例變量,會話和請求對象的線程綁定,如果你執行的可運行在不同的線程比處理你將不能訪問原始請求的一個他們。

+0

但是不應該ServletRequestAttributes保留它嗎?我也考慮過存儲會話,但是如何在請求中設置它?我想避免使用反射並將所有屬性複製到新創建的會話對象。 – calin

相關問題