2011-03-11 86 views
5

我想实现以下逻辑: 当我收到HttpServletRequeset和HttpServletResponse在主servlet的doService方法(在主Web容器线程中)时,我启动了A,B,C三个线程(由我自己的程序管理的线程)来处理并行模式下的其他servlet,然后在主线程中加入这些servlet的每个响应,如果我自己的一个线程(假设为A线程)工作缓慢,主线程将完成,因此主响应将返回给user.and 一个线程必须继续正常工作,稍后我会在浏览器端请求使用AJAX的A线程的响应。如何克隆由Servlet容器提供的分离的HttpServletRequest和HttpServletResponse?

所以,我想克隆由servlet容器提供的HttpServlettRequest和HttpServletResponse,和克隆的请求和响应必须分离(当容器的HttpServletTrequest和HttpServletResponse成品,克隆的请求和效应初探仍然正常工作)。

克隆请求和响应的行为必须与我的代码视图中的容器相同,可以遵循并包含它。

有什么想法?

非常感谢!

L.J.W

+1

你不能。期。什么是功能要求?然后我们可以提供更适合的答案/建议以达到功能要求。 – BalusC 2011-03-11 14:13:57

回答

3

听起来像是你需要创建类的代表采取行动,HttpRequest中和的HttpResponse对象,然后通过一个参考上一个Runnable对象的过程。

有一些操作只能对HttpRequest对象执行一次(从输入流中读取弹出的内容),委托类将不得不迎合这一点。

不知道如果A,B和C线程对HttpResponse对象做出冲突更改,你会怎么做。

我想我宁愿不通过传递HttpResponse对象的处理线程,离开逻辑用于填充在控制servlet类

+0

我想克隆的请求和响应可以分离,所以我不能通过引用(等等,我不能使用wrap方法) – 2011-03-11 13:55:38

+1

@LJW:你说什么都没有意义。 “我不能通过引用”,那么你一定不能使用Java ... – 2011-03-11 14:24:47

+1

@ L.J.W你可以想,但你不会在收到响应时使用响应是未定义的行为。换句话说,它会崩溃,因为流(可能)已关闭)。 – extraneon 2011-03-11 14:53:03

2

我想你问得多HttpServletRequest的响应。请求完成后,您不应该指望请求对象有任何用处。无论如何,我不建议在大多数情况下在J2EE容器内进行线程化,但这是一个不同的问题。

如果必须并行处理的要求,我建议您提取您从请求对象所需要的数据和发送到你的线程,使工作线程大多Servlet的无知与在那里他们可以存储在HttpSession除外他们的计算值为Ajax检索。

+0

线程必须处理servletrequest和响应,我不能发送其他数据类型.. – 2011-03-11 13:58:38

+0

@ L.J.W换句话说,您需要实现一个自定义的HttpRequest和HttpResponse,并使用从给定的请求和响应复制的数据来初始化它。不要复制这些流,因为这是行不通的。 – extraneon 2011-03-11 14:54:41

3

请求和响应类不旨在从多个线程克隆或访问。如果你尝试这样做,你一定会遇到问题。我建议你重新考虑你的要求。

5

通过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信息的副本并将其传递给不同的线程。

相关问题