由于某种原因,当我尝试在像这里的单独线程中访问它们时, 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();
我想异步处理该线程中的一些数据。
当我将代码放在线程之外时,它可以工作。
答案 0 :(得分:0)
servlet引擎的“通常”实现具有在请求处理过程开始时创建的请求和响应对象,即在调用service()之前。我希望这些对象的生命周期比请求本身更长。因此,请求对象没有标题这一事实对我来说很奇怪。但是,我不知道为什么会发生这种情况,我认为如果没有看到测试用例就很难解决问题。
但是......
请求完成后,生成的线程无法与客户端/浏览器通信。在此线程中执行的任何工作对客户端都是不可见的。因此,它完全独立于请求 - 响应流,在我看来,它应该有自己的API,而不是依赖于servlet容器的奇思妙想。
所以我的方法是定义一个Java类,它包含异步线程执行任何操作所需的所有数据,并在请求处理过程中将所有相关数据复制到该类的新实例中(在doGet中) ()等)。然后将新实例传递给异步线程。因此,该线程与处理servlet请求的机制完全分离。
不言而喻,从Servlet中产生新线程 - 尽管是合法的 - 充满了困难。必须非常注意同步问题。