如果我的问题很愚蠢,我很抱歉。
我正在使用ArrayBlockingQueue。
private ArrayBlockingQueue<RequestParameters> processorQueue;
private int sizeOfQueue = 3000;
在这里,我的生产者是单独的线程,消费者是单独的线程。 两者都在单生产者-消费者线程模型中运行。
现在,我正在运行我的 Java 应用程序,它向我的 Servlet 发出请求。生产者将请求放入队列中。 Consumer拍下请求并开始处理,其中涉及到DB操作。(大约需要1秒完成任务)
在这里,我的生产者非常快地获取请求,它填充队列并等待消费者开始处理并在队列中腾出空间。
我的问题是
- 我应该使用什么最好的 BlockingQueue Impl,这样我才能获得最佳性能。
- 当队列大小已满时会发生什么,我的意思是,无论 Producer 是否正在等待队列变空,Servlet 都会收到请求。所有这些传入的请求怎么样?这些请求会去哪里?那些请求是 存储在 JVM 内存中并在非阻塞后交给生产者线程?
谢谢。
最佳答案
尽管正确的解决方案取决于您的应用程序要求的可行性,但以下内容可能会有所帮助:
当 Q 已满而不是无限期地阻塞时,请使用 timeout
进行阻塞,以便 servlet 将在固定配置的时间内返回响应。如果发生超时
,servlet 可以抛出服务器繁忙类型的自定义错误消息或相关的HTTP-CODE
。
由于您的消费者速度很慢而生产者非常快,您不妨考虑增加消费者线程,以减少 servlet 调用者的阻塞体验。
此外,接受所有请求(即存储到无界 Q 中)并不是一个好的解决方案,因为(取决于请求大小)由于消费者 Q 速度较慢,随着时间的推移可能会消耗大量内存。
关于java - 多个请求的阻塞队列行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17717620/