我有一个 Servlet,它从客户端获取请求,然后 Servlet 通过 http 请求/响应从 5 个不同的服务器收集数据(每个服务器需要 1 秒来响应)并将数据发送回客户端。
问题在于客户端必须等待 6 秒才能响应,时间太长。 因此向 5 个 Server 的 5 个请求必须同时发送。
想法:
- Servlet 中的多线程,就像普通的 Java 应用程序一样。
- 每个服务器(请求)都有一个自己的 Servlet,以便 1 个主 Servlet 对 5 个 Gather Servlet 说“获取数据 xy”,然后收集 Servlet 将数据发送到主 Servlet,然后将主 Servlet 返回给客户端。
我担心的问题是,线程/servlet 从另一个请求获取响应,因为它具有相同的时间和相同的 ip。
如何解决这个问题?谢谢!
最佳答案
Multithreading in the Servlet
您可以使用ServletRequest#startAsync()将此请求置于异步模式,并使用原始(未包装的)ServletRequest 和 ServletResponse 对象初始化其 AsyncContext 的方法。
了解更多关于Servlet 3 0 final-spec - Section 2.3.3.3 - Asynchronous processing的信息其中有详细解释。
AsyncContext
是 Servlet 3.0 规范中定义的用于异步处理 HTTP 请求的标准方式。
了解更多关于Executors.newFixedThreadPool()
的信息创建一个线程池,该线程池重用在共享无界队列上运行的固定数量的线程。在任何时候,最多 nThreads 个线程将处于 Activity 处理任务状态。如果在所有线程都处于 Activity 状态时提交其他任务,它们将在队列中等待,直到有线程可用。
请查看ExecutorService
阅读有关它的更多信息以及示例代码。
关于java - JSP Servlet多线程问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24951627/