将RequestAttributes传递给新线程后,会话将丢失

时间:2012-10-16 09:20:21

标签: java multithreading spring session web-applications

我有一个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;
    }
}

有什么想法吗?

1 个答案:

答案 0 :(得分:2)

在构造函数中获取会话并将其保存在实例变量中,Session和Request对象是线程绑定的,如果在与处理原始请求的线程不同的线程中执行runnable,则无法访问它们