我已经完成了以下Java Servlet构建:[我相信主要的想法是消费者 - 生产者]
接收多个http POST请求的Java servlet
它将所有请求放入队列[ConcurrentLinkedQueue]
队列中的所有请求都由一个独立的线程(如引擎)处理。该线程独立于servlet工作。 单独的线程有一个很好的理由,因为我需要来自几个不同的http请求的数据来进行处理。队列等待它有足够的请求然后开始处理。
现在我处于最后一步:例如http请求No1已由独立线程引擎处理,我需要通知特定的servlet线程(例如No1)来自哪里,以便我可以回复,即将响应发送回相应的客户端。
如何解决此线程问题?单线程引擎如何每次都通知正确的servlet线程?我该如何编码?
答案 0 :(得分:2)
我不知道这些要求来自哪里,但还有其他一些更简单的方法可以解决这个问题:
使用ExecutorService
。只需将任务提交到池并阻止返回的Future
对象。非常简单有效。任务准备就绪后,Future.get()
将返回结果
使用Servlet 3.0,您可以将整个处理放在异步线程中。这 更具可扩展性。基本上,您正在提交任务并立即释放HTTP线程。异步线程不仅处理该队列中的项目,还通过AsyncContext
对象返回HTTP响应。
如果您确实需要使用队列和单独的线程,请查看Java locks和conditions。但这是更低层次的工作。
答案 1 :(得分:1)
使用SingleThreadExecutor。让您的servlet创建Callable对象并将它们提交给执行程序,然后在返回的Future上调用get()
:
Callable<Foo> callable = new Callable<Foo>() {
// TODO implement call();
};
Future<Foo> future = executor.submit(callable);
Foo result = future.get();
答案 2 :(得分:0)
为什么你有一个很好的理由在一个单独的线程中有一个队列来执行工作?如果servlet需要等待处理结果才能向客户端返回响应,那么为什么不在同一个线程中执行处理并同步返回结果呢?
如果你真的想异步做事,你可以使用Future对象检查计算的完成状态,并获得结果。