Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 将RequestAttributes传递给新线程后,会话将丢失_Java_Multithreading_Spring_Session_Web Applications - Fatal编程技术网

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

Java 将RequestAttributes传递给新线程后,会话将丢失,java,multithreading,spring,session,web-applications,Java,Multithreading,Spring,Session,Web Applications,我有一个web应用程序(使用spring和vaadin),我需要创建一个辅助线程来完成一些工作(我不能用另一种方法来完成这项工作,因为现有的代码我无法更改)。在这个线程中,我需要访问会话。我发现了这个有用的答案: 一切正常,但在线程启动后,当我尝试获取会话时,我会得到null。但是我仍然可以得到会话id public RequestAwareRunnable() { this.requestAttributes = RequestContextHolder.getRequestAttr

我有一个web应用程序(使用spring和vaadin),我需要创建一个辅助线程来完成一些工作(我不能用另一种方法来完成这项工作,因为现有的代码我无法更改)。在这个线程中,我需要访问会话。我发现了这个有用的答案:

一切正常,但在线程启动后,当我尝试获取会话时,我会得到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;
    }
}

有什么想法吗

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

但是ServletRequestAttributes不应该保留它吗?我还考虑过存储会话,但如何在请求中设置会话?我希望避免使用反射并将所有属性复制到新创建的会话对象。