发送响应后的Servlet进程数据

时间:2017-08-30 08:18:24

标签: java multithreading servlets request post-processing

由于某种原因,当我尝试在像这里的单独线程中访问它们时, HttpServletRequest 中没有请求标头:

new Thread() {
    public void run() {
        Enumeration<String> headerNames = request.getHeaderNames();
        if (headerNames != null) {
            while (headerNames.hasMoreElements()) {
                String header_name = headerNames.nextElement();
                System.out.println("Header: " + request.getHeader(header_name));

            }
        }
    }
}.start();

我想异步处理该线程中的一些数据。

当我将代码放在线程之外时,它可以工作。

1 个答案:

答案 0 :(得分:0)

servlet引擎的“通常”实现具有在请求处理过程开始时创建的请求和响应对象,即在调用service()之前。我希望这些对象的生命周期比请求本身更长。因此,请求对象没有标题这一事实对我来说很奇怪。但是,我不知道为什么会发生这种情况,我认为如果没有看到测试用例就很难解决问题。

但是......

请求完成后,生成的线程无法与客户端/浏览器通信。在此线程中执行的任何工作对客户端都是不可见的。因此,它完全独立于请求 - 响应流,在我看来,它应该有自己的API,而不是依赖于servlet容器的奇思妙想。

所以我的方法是定义一个Java类,它包含异步线程执行任何操作所需的所有数据,并在请求处理过程中将所有相关数据复制到该类的新实例中(在doGet中) ()等)。然后将新实例传递给异步线程。因此,该线程与处理servlet请求的机制完全分离。

不言而喻,从Servlet中产生新线程 - 尽管是合法的 - 充满了困难。必须非常注意同步问题。