我已经完成了以下Java Servlet构建:[我相信主要思想是消费者-生产者]
接收多个 http POST 请求的 Java servlet
它将所有请求放入队列 [ConcurrentLinkedQueue]
队列中的所有请求都由单个独立的线程(如引擎)处理。该线程独立于 servlet 工作。 单独的线程有一个很好的理由,因为我需要来自多个不同的 http 请求的数据来进行处理。队列等待,直到有足够的请求,然后开始处理。
现在我进入了最后一步:例如,一次http请求No1已经被独立线程引擎处理了,我需要通知具体的servlet线程(例如No1)它来自哪里,以便我可以回复,即将响应发送回相应的客户端。
如何解决这个线程问题?单线程引擎如何每次通知正确的servlet线程?我应该如何编码?
最佳答案
我不知道这些要求从何而来,但是还有其他几种更简单的方法可以解决此问题:
使用
ExecutorService
。只需向池提交一个任务并在返回的Future
上阻塞即可目的。非常简单有效。一旦您的任务准备就绪,Future.get()
将返回结果使用 Servlet 3.0,您可以将整个处理放在异步线程中。这更具可扩展性。基本上,您正在提交任务并立即释放 HTTP 线程。异步线程不仅处理该队列中的项目,还通过
AsyncContext
对象返回 HTTP 响应。
如果你确实需要使用队列和单独的线程,请查看 Java locks和 conditions 。但这是低级工作。
关于Java Servlet 线程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11600737/