【问题标题】:Servlet process data after response was sent发送响应后的 Servlet 进程数据
【发布时间】:2018-02-07 20:51:43
【问题描述】:

由于某种原因,当我尝试在像这里这样的单独线程中访问它们时,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();

我想在那个线程中异步处理一些数据。

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

【问题讨论】:

  • 你确定你的主线程确实等到新线程运行吗?
  • 不,它结束了。发送响应后是否有另一种处理数据的方法?如果有很长的任务要处理,浏览器一直等到完成是很烦人的……
  • 您需要等待主线程并留出时间让新生成的线程运行。

标签: java multithreading servlets request post-processing


【解决方案1】:

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

但是……

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

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

不言而喻,从 Servlet 生成新线程(尽管是合法的)充满了困难。必须对同步问题给予高度关注。

【讨论】:

  • 很奇怪。在 nodejs 我可以做 res.end() 断开客户端,然后处理长时间运行的任务......
  • 当然,但大概你最终会得到一个请求处理线程,它在做一些不再是关于请求处理的事情。我的经验是,网络服务器通常为特定任务提供固定大小的线程池,并且让请求处理线程忙于其他工作,只剩下几个线程来处理客户端请求。不过,这不是 OP 的问题,如果我理解正确的话——OP 在请求结束时会产生一个单独的线程(我认为。)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-09-21
  • 2020-03-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-07-31
  • 2012-09-19
相关资源
最近更新 更多