如何在运行的Thread中持久化请求对象?

时间:2015-09-25 09:16:31

标签: java multithreading scope

我将HttpServletRequest对象传递给Thread然后返回它。线程将被执行很长时间但在此之前我返回请求。因此,我无法访问Thread中的HttpServletRequest对象。那么即使在完成会话之后,有没有办法在整个线程执行中持久化HttpServletRequest对象?

function

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

2 个答案:

答案 0 :(得分:2)

您不需要该请求。您需要在请求中提供一些信息。

只需从请求中提取它们并使用它们构造一个对象并将其传递给runnable对象。

以下是示例代码:

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

答案 1 :(得分:1)

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

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

  

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

使用ExecutorService而不是从servlet手动启动线程,因为后者对于可伸缩性来说是个坏主意。