Java 如何在正在运行的线程中持久化请求对象?

Java 如何在正在运行的线程中持久化请求对象?,java,multithreading,scope,Java,Multithreading,Scope,我将HttpServletRequest对象传递给一个线程,然后返回它。线程将执行很长时间,但在此之前我返回请求。因此,我无法访问线程中的HttpServletRequest对象。那么,即使在完成HttpServletRequest对象的会话之后,是否有任何方法可以在整个线程执行过程中持久化该对象 public String execute(HttpServletRequest request){ Runnable r = new RunnableImplementation(r

我将HttpServletRequest对象传递给一个线程,然后返回它。线程将执行很长时间,但在此之前我返回请求。因此,我无法访问线程中的HttpServletRequest对象。那么,即使在完成HttpServletRequest对象的会话之后,是否有任何方法可以在整个线程执行过程中持久化该对象

 public String execute(HttpServletRequest request){
       Runnable r = new RunnableImplementation(request);
       Thread t = new Thread(r);
       t.start();
       return "Success";
    }

注意:RunnableImplementation的构造函数初始化其本地HttpServletRequest对象,然后在其run()方法中使用它。

您不太可能需要请求对象中的所有内容,因此请编写一个只存储所需位的类,并将其实例传递给后台任务。这样做的原因是,虽然原始请求对象不会在请求结束时神奇地“消失”(只要您持有对它的强引用,它就不能被垃圾收集),但谁知道应用程序服务器对其字段做了什么呢?可能什么都没有,但可能它会将它们置空,可能它会将该对象重新用于另一个请求。所有这些都是可能的

3.0 Java Servlet规范在第3.11节中明确介绍了这一主题:

每个请求对象仅在servlet的 服务方法,或在筛选器的doFilter方法的范围内, 除非为组件启用了异步处理,否则 对请求对象调用
startAsync
方法。在这种情况下 在发生异步处理时,请求对象保持有效 直到在
AsyncContext
上调用
complete
。集装箱 回收请求对象,以避免 请求对象创建。开发人员必须意识到维护 对
startAsync
尚未启用的请求对象的引用 不建议在上述范围之外调用,因为可能 有不确定的结果


并使用ExecutorService,而不是从servlet手动启动线程,因为后者对于可伸缩性来说是一个非常糟糕的主意。

您不太可能需要请求对象中的所有内容,因此请编写一个只存储所需位的类,并将其实例传递给后台任务。这样做的原因是,虽然原始请求对象不会在请求结束时神奇地“消失”(只要您持有对它的强引用,它就不能被垃圾收集),但谁知道应用程序服务器对其字段做了什么呢?可能什么都没有,但可能它会将它们置空,可能它会将该对象重新用于另一个请求。所有这些都是可能的

3.0 Java Servlet规范在第3.11节中明确介绍了这一主题:

每个请求对象仅在servlet的 服务方法,或在筛选器的doFilter方法的范围内, 除非为组件启用了异步处理,否则 对请求对象调用
startAsync
方法。在这种情况下 在发生异步处理时,请求对象保持有效 直到在
AsyncContext
上调用
complete
。集装箱 回收请求对象,以避免 请求对象创建。开发人员必须意识到维护 对
startAsync
尚未启用的请求对象的引用 不建议在上述范围之外调用,因为可能 有不确定的结果


并使用ExecutorService,而不是从servlet手动启动线程,因为后者对于可伸缩性来说是一个非常糟糕的主意。

您不太可能需要请求对象中的所有内容,因此请编写一个只存储所需位的类,并将其实例传递给后台任务。这样做的原因是,虽然原始请求对象不会在请求结束时神奇地“消失”(只要您持有对它的强引用,它就不能被垃圾收集),但谁知道应用程序服务器对其字段做了什么呢?可能什么都没有,但可能它会将它们置空,可能它会将该对象重新用于另一个请求。所有这些都是可能的

3.0 Java Servlet规范在第3.11节中明确介绍了这一主题:

每个请求对象仅在servlet的 服务方法,或在筛选器的doFilter方法的范围内, 除非为组件启用了异步处理,否则 对请求对象调用
startAsync
方法。在这种情况下 在发生异步处理时,请求对象保持有效 直到在
AsyncContext
上调用
complete
。集装箱 回收请求对象,以避免 请求对象创建。开发人员必须意识到维护 对
startAsync
尚未启用的请求对象的引用 不建议在上述范围之外调用,因为可能 有不确定的结果


并使用ExecutorService,而不是从servlet手动启动线程,因为后者对于可伸缩性来说是一个非常糟糕的主意。

您不太可能需要请求对象中的所有内容,因此请编写一个只存储所需位的类,并将其实例传递给后台任务。这样做的原因是,虽然原始请求对象不会在请求结束时神奇地“消失”(只要您持有对它的强引用,它就不能被垃圾收集),但谁知道应用程序服务器对其字段做了什么呢?可能什么都没有,但可能它会将它们置空,可能它会将该对象重新用于另一个请求。所有这些都是可能的

3.0 Java Servlet规范在第3.11节中明确介绍了这一主题:

每个请求
MyThreadRequest myThreadRequest = new MyThreadRequest();
myThreadRequest.setUser((User) request.getAttribute("user"));
Thread t = new Thread(new RunnableImplementation(myThreadRequest));