实现基于文件的队列

时间:2010-06-30 23:01:27

标签: java queue persistent

我有一个内存有界的队列,其中有多个线程队列对象。通常,队列应该由处理队列中项目的单个读取器线程清空。

但是,队列可能已填满。在这种情况下,我想在磁盘上保留任何其他项目,这些项目将由另一个后台读取器线程处理,该线程扫描目录中的这些文件并处理文件中的条目。我熟悉Active MQ,但更喜欢更轻量级的解决方案。如果没有严格遵循“FIFO”,则可以(因为可以不按顺序处理持久化的条目)。

那里有没有开源解决方案?在我自己开始实施之前,我没有发现任何事情,但我认为我会在此列表中查找建议。

谢谢!

7 个答案:

答案 0 :(得分:6)

查看http://square.github.io/tape/及其令人印象深刻的QueueFile。

(感谢Brian McCallister的“The Long Tail Treasure Trove”指点我)。

答案 1 :(得分:4)

您可以使用类似SQLite的东西来存储对象。

答案 2 :(得分:3)

EHCache可以溢出到磁盘。它也是高度并发的,尽管你真的不需要那个

答案 3 :(得分:1)

为什么队列有界?为什么不使用动态可扩展的数据结构?这似乎比涉及磁盘简单得多。

修改 在更多背景下很难回答你的问题。

你能澄清“内存不足”的意思吗?队列有多大?你有多少记忆?

您是否使用内存非常少的嵌入式系统?或者队列中有2 GB或更多的东西?

如果其中一个是真的,那么你真的应该使用像BTree这样的“可交换”数据结构。为一个队列实现一个你自己似乎有点矫枉过正。我会使用像SQL lite这样的嵌入式数据库。

如果这些都不是真的,那么只需使用矢量或链表。

编辑2: 您可能不需要BTree或数据库。您可以使用链接的页面列表。但是,再次, 我不得不问:这有必要吗?

或者,如果您愿意非串行处理事情,为什么不一直有多个读者线程?

最终,虽然我不认为你的建议是可行的。

答案 4 :(得分:1)

你可以嵌入berkeley db java版本来保存文件中的队列元素。

您可以在此处查看工作示例: http://sysgears.com/articles/lightweight-fast-persistent-queue-in-java-using-berkley-db

希望这有帮助

答案 5 :(得分:1)

我现在发现的最高性能和GC友好解决方案是Chronicle Queue。 它具有极低的写入延迟,数十纳秒的数量级,比MapDB或SQLite低几个等级。

答案 6 :(得分:0)

  

MapDB提供由磁盘存储或堆外内存支持的并发映射,集和队列。它是一种快速且易于使用的嵌入式Java数据库引擎。

https://github.com/jankotek/MapDB

http://www.mapdb.org/