具有溢出到磁盘的Java FIFO队列

时间:2012-01-01 11:58:30

标签: java queue disk persistent fifo

我正在/准备一个基于生产者/消费者模型的应用程序。在我的情况下,将有一个生产者生成几个百万(非平凡)任务,并且将有可配置数量的消费者。

生产者和消费者之间的沟通基本上是基于队列的。然而我担心内存消耗:可以想象任务数量将超过JVM的可用内存。所以我想要一个Queue实现只保留内存中“top-X”数量的队列项,并将其余的存储在磁盘上。这不必具有弹性,因为它不需要在重新启动程序后继续存在。

我一直在搜索,但找不到似乎广泛使用的Queue实现(似乎有一些,我称之为概念验证实现,但我很担心未来支持/继续发展这些实施)。我也看了外部消息队列应用程序,但是(1)我不想运行第二个外部进程和(2)甚至在同一个JVM进程中嵌入消息代理似乎对这个要求有点“头重脚轻”

是否有人知道任何提供此功能的支持未来的未来库?

RGDS

2 个答案:

答案 0 :(得分:1)

嗯,JMS似乎是一个明显的解决方案。我认为你不会找到解决这个问题的可靠方法,因为JMS解决了这个问题并且是标准的解决方案。

但是请注意,Java也有BoundedQueues来解决这个问题:对队列进行维度以确保在队列已满时它不会因OOME而失败,并且生成器在尝试将消息放入完整有界时将被阻止队列,直到其中一个消费者从队列中删除某个任务。

答案 1 :(得分:0)

当有足够多的任务被消耗时,生成器块通常比让队列增长和消耗更多内存更有效。例如如果你的队列适合队列,它可以比没有队列的队列快几倍。