出于某种原因,当我尝试在单独的线程中访问它们时,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/