我想实现以下逻辑: 当我在主servlet的doService方法(在主Web容器线程中)中收到HttpServletRequeset和HttpServletResponse时,我启动A,B,C三个线程(由我自己的程序管理的线程)以并行模式处理其他servlet,然后加入每个响应从主线程中的这些servlet,如果我自己的一个线程(假设一个线程)工作缓慢,主线程将完成,所以主响应将返回给user.and 一个线程必须继续正常工作,稍后我将在浏览器端使用AJAX请求A线程的响应。
所以,我想克隆Servlet容器提供的HttpServlettRequest和HttpServletResponse,并且克隆的请求和响应必须分离(当容器的HttpServletTrequest和HttpServletResponse完成时,克隆的请求和响应仍然正常)。
克隆的请求和响应的行为必须与我的代码视图中的容器相同。它可以被跟踪和包含。
有什么想法吗?
非常感谢!
L.J.W
答案 0 :(得分:6)
可以通过HttpServletResponseWrapper类http://docs.oracle.com/javaee/1.3/api/javax/servlet/http/HttpServletResponseWrapper.html克隆HTTP请求和响应。您可以在Sun文档https://web.archive.org/web/20120626033905/http://java.sun.com/j2ee/tutorial/1_3-fcs/doc/Servlets8.html上找到使用示例。
请注意,这是Sun(当时)解决此问题的一种解决方法,因为从未计划过您可以在提交之前修改请求和响应信息。
您可以使用包装器制作Http信息的副本,并将其传递给其他线程。
答案 1 :(得分:4)
听起来你需要创建类来充当HttpRequest和HttpResponse对象的委托,然后将on的引用传递给要处理的Runnable对象。
某些操作只能对HttpRequest对象执行一次(从输入流中读取),委托类必须满足此要求。
如果A,B和C线程对HttpResponse对象进行了相互冲突的更改,那么不确定要做什么。
我想我宁愿不将HttpResponse对象传递给处理线程,并留下用于在控制servlet类中填充响应的逻辑
答案 2 :(得分:3)
请求和响应类不是为了克隆或从多个线程访问而设计的。如果你试图这样做,你一定会遇到问题。我建议你重新考虑你的要求。
答案 3 :(得分:2)
我认为你要求HttpServletRequest的大部分内容。请求完成后,您不应指望请求对象具有任何用途。在大多数情况下,我不建议在J2EE容器内进行线程化,但这是一个不同的问题。
如果必须并行处理请求,我建议您从请求对象中提取所需的数据并将其发送到您的线程,并使工作线程主要是Servlet无知,但HttpSession除外他们可以存储他们的Ajax检索计算值。