java - 发送响应后Servlet处理数据

标签 java multithreading servlets request post-processing

出于某种原因,当我尝试在单独的线程中访问它们时,HttpServletRequest 中没有请求 header ,如下所示:

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();

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

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

最佳答案

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

但是...

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

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

不言而喻,从 Servlet 生成新线程虽然合法,但却充满了困难。必须特别注意同步问题。

关于java - 发送响应后Servlet处理数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45955352/

相关文章:

java - 在 GWT 中从属性文件动态加载值

Java 未正确将字符串转换为长对象

multithreading - 我应该并行化多少代码执行?

c - 为什么我的函数没有运行并出现无效内存错误?

java - volatile 和 static 关键字有什么区别?

jsp - 如何更改从 servlet 重定向的 JSP 的 URL

java - 在 servlet 中,我想在另一个线程运行时有一个 response.print()

java - 通过将下一项移动到其位置来删除数组中的一项

java - 被拒绝的 bean 名称 'propertyConfigurer' : no URL paths identified

java - 如何使用正则表达式从java中的短语中检查和提取信用卡号