如果我的问题很愚蠢,我很抱歉。
我正在使用ArrayBlockingQueue。
private ArrayBlockingQueue<RequestParameters> processorQueue;
private int sizeOfQueue = 3000;
这里,我的Producer是单独的线程,而Consumer是单独的线程。 两者都在Single Producer-Consumer Thread模型中运行。
现在,我正在运行我的Java App,它向我的Servlet发出请求。制作人将请求放入队列中。 消费者请求请求并开始处理,这涉及数据库操作。(完成任务大约需要1秒)
在这里,My Producer非常快速地获取请求并填充Queue并等到消费者开始处理并在队列中腾出空间。
我的问题是
感谢。
答案 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中。