0

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

我正在使用 ArrayBlockingQueue。

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

在这里,我的生产者是单独的线程,消费者是单独的线程。两者都在单生产者-消费者线程模型中运行。

现在,我正在运行我的 Java 应用程序,它向我的 Servlet 发出请求。生产者将请求放入队列。消费者对请求进行拍照并开始处理,这涉及到数据库操作。(完成任务大约需要 1 秒)

在这里,我的生产者收到请求的速度非常快,它会填满队列并等待消费者开始处理并在队列中腾出空间。

我的问题是

  1. 我应该使用什么最好的 BlockingQueue Impl,这样我才能获得最好的性能。
  2. 当队列大小已满时会发生什么,我的意思是 Servlet 将收到请求,而不管生产者是否正在等待队列获得空缺。所有这些传入的请求呢?这些请求将去哪里?这些请求是否存储在 JVM 内存中并在非阻塞时提供给生产者线程?

谢谢。

4

3 回答 3

2

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

当 Q 已满而不是无限期地阻塞时,阻塞 withtimeout以便 servlet 将在固定配置的时间内返回响应。在这种情况下timeout,servlet 可能会抛出 server-busy 类型的自定义错误消息或相关的HTTP-CODE.

由于您的消费者很慢而生产者非常快,您不妨考虑增加消费者线程,以减少对 servlet 调用者的阻塞体验。

此外,接受所有请求(即存储到无界 Q 中)不是一个很好的解决方案,因为(取决于请求大小)由于缓慢的消费者 Q,随着时间的推移可能会消耗大量内存。

于 2013-07-18T07:54:03.343 回答
1

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

考虑到系统中有网络,如果它有任何不同,我会感到惊讶,但如果 FIFO 性能是您的标准并且没有随机访问,您应该考虑使用基于链表的网络。

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

您指定BlockingQueue,了它会阻止。

这都在 Javadoc 中。

于 2013-07-18T08:47:42.733 回答
1

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

private BlockingQueue<RequestParameters> processorQueue = ...

2)您不需要额外的字段sizeOfQueue- 您将其值传递给processorQueue.

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

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

于 2013-07-18T07:55:36.633 回答