溢出到磁盘的Java FIFO队列

溢出到磁盘的Java FIFO队列,java,queue,disk,persistent,fifo,Java,Queue,Disk,Persistent,Fifo,我正在工作/准备一个基于生产者/消费者模型的应用程序。在我的例子中,将有一个生产者生成数个000000(非平凡)任务,并且将有可配置数量的消费者 生产者和消费者之间的通信基本上是基于队列的。然而,我担心内存消耗:任务的数量很可能会超过JVM的可用内存。所以我希望有一个队列实现,它只在内存中保留“top-X”数量的队列项,并将其余的存储在磁盘上。这不必具有弹性,因为它不需要在程序重新启动后生存 我四处搜索,但找不到一个似乎被广泛使用的队列实现(我称之为概念验证实现,但我担心这些实现的未来支持/持续

我正在工作/准备一个基于生产者/消费者模型的应用程序。在我的例子中,将有一个生产者生成数个000000(非平凡)任务,并且将有可配置数量的消费者

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

我四处搜索,但找不到一个似乎被广泛使用的队列实现(我称之为概念验证实现,但我担心这些实现的未来支持/持续发展)。我还研究了外部消息队列应用程序,但是(1)我不想运行第二个外部进程,(2)即使在同一个JVM进程中嵌入消息代理,对于这个需求来说似乎也有点“头重脚轻”

是否有人知道有任何支持良好的未来证明库提供此功能


Rgds

好吧,JMS似乎是显而易见的解决方案。我认为您不会找到解决这个问题的可靠方法,因为JMS解决了这个问题,并且是一个标准的解决方案


但是请注意,Java也有BoundedQueues来解决这个问题:对队列进行尺寸标注,以确保当队列已满时,队列不会因OOME而失败,并且生产者将在尝试将消息放入完全有界队列时被阻止,直到某个使用者从队列中删除某个任务为止

当有足够多的任务要消耗时,使用生产者块通常比让队列增长和消耗更多内存更有效。e、 g.如果您的队列适合该队列,它可能比不适合的队列快好几倍。

True,我考虑过使用BoundedQueue(但仍然没有排除)。听起来,制作制作人block.Btw效率很低。我不同意这样的假设,即既然JMS存在并解决了这一问题,就没有其他解决方案/实现的空间。JMS对于这样的东西来说真是太过分了。例如,这种“内存受限队列”可能是嵌入式系统中的一项要求,因为在嵌入式系统中,JMS消息代理没有空间/资源。如果生产者对消费者来说速度太快,则使生产者阻塞将允许消费者有更多的CPU时间(或带宽)分配给他们,因此,生成和使用大量任务所花费的总时间可能与使用磁盘备份队列所花费的时间相同(甚至更低,因为您无需从/向磁盘进行读写)。对我来说,如果队列很快填满,可能是生产者数目和消费者数目之间的比例不合适。队列有一定的灵活性是很有用的,但它的目标是调节速度,而不仅仅是存储任务。的确,让生产者阻塞可能比使用溢出到磁盘的队列更好/更快地解决我的问题。但是,如果不进行测试,我们永远无法确定;)你有没有为你的问题找到可靠的解决方案。我希望解决一个相同的情况。谢谢