多个请求的BlockingQueue行为

时间:2013-07-18 07:47:58

标签: java multithreading servlets queue blockingqueue

如果我的问题很愚蠢,我很抱歉。

我正在使用ArrayBlockingQueue。

private ArrayBlockingQueue<RequestParameters> processorQueue;
private int sizeOfQueue = 3000;

这里,我的Producer是单独的线程,而Consumer是单独的线程。 两者都在Single Producer-Consumer Thread模型中运行。

现在,我正在运行我的Java App,它向我的Servlet发出请求。制作人将请求放入队列中。 消费者请求请求并开始处理,这涉及数据库操作。(完成任务大约需要1秒)

在这里,My Producer非常快速地获取请求并填充Queue并等到消费者开始处理并在队列中腾出空间。

我的问题是

  1. 我应该使用什么最好的BlockingQueue Impl,这样我才能获得最佳性能。
  2. 当队列大小为Full时会发生什么,我的意思是Servlet将获得请求,而不管Producer是否在等待Queue获得Vaccant。那些收到的请求怎么样?那些请求会去哪里?是那些要求 存储在JVM内存中,一旦它是非阻塞的,就会提供给Producer Thread吗?
  3. 感谢。

3 个答案:

答案 0 :(得分:2)

虽然正确的解决方案取决于您的应用程序要求的可行性,但以下内容可能会有所帮助:

当Q已满而不是无限期阻塞时,阻塞timeout,因此servlet将在修复配置的时间内返回响应。对于timeout,servlet可以抛出服务器繁忙的自定义错误消息或相关的HTTP-CODE

由于您的消费者很慢并且生产者速度非常快,因此您可以考虑增加消费者线程,以便为servlet调用者提供较少的阻塞体验。

此外,接受所有请求(即存储到无限制的Q)将不是一个很好的解决方案(取决于请求大小)由于消费者Q缓慢,在一段时间内可能会消耗大量内存..

答案 1 :(得分:1)

1)不要将具体实现用作字段的类型或方法的返回类型的变量等。请改用接口或抽象类。在您的情况下,此类将只是BlockingQueue

private BlockingQueue<RequestParameters> processorQueue = ...

2)您不需要添加其他字段sizeOfQueue - 您会将其值传递给processorQueue的构造函数。

3)最后,您可以将LinkedBlockingQueue实施用于此目的:

private BlockingQueue<RequestParameters> processorQueue = new LinkedBlockingQueue(300);

答案 2 :(得分:1)

  

我应该使用什么最好的BlockingQueue Impl,这样我才能获得最佳性能。

如果系统中有网络,我会感到惊讶,但如果FIFO性能是您的标准并且没有随机访问权限,您应该根据链表使用一个网络。

  

队列大小已满时会发生什么

您指定了BlockingQueue,,因此会阻止。

这一切都在Javadoc中。