Question

I ai une file d'attente dans la mémoire limitée dans laquelle la file d'attente de plusieurs threads d'objets. Normalement, la file d'attente doit être vidé par un seul fil de lecteur qui traite les articles dans la file d'attente.

Cependant, il est possible que la file d'attente est remplie. Dans ce cas, je voudrais persister tout élément supplémentaire sur le disque qui serait traité par un autre thread lecteur d'arrière-plan qui scanne un répertoire pour ces fichiers et traite les entrées dans les fichiers. Je connais avec Active MQ, mais préfère une solution de poids plus léger. Il est ok si le « FIFO » est pas strictement suivi (puisque les entrées persistaient peuvent être traitées hors service).

Y a-t-il des solutions open source là-bas? Je ne trouve pas, mais je pensais que cette liste ping suggestions avant de se lancer dans l'application moi-même.

Merci!

Était-ce utile?

La solution

Vous pouvez utiliser quelque chose comme SQLite pour stocker les objets.

Autres conseils

Jetez un oeil à http://square.github.io/tape/ , et son QueueFile impressionnant.

(grâce à "The Long Tail trésor" de Brian McCallister pour moi montrant que).

EHCache peut déborder sur le disque. Il est également très en même temps, si vous avez vraiment pas besoin que

Pourquoi la file d'attente limitée? Pourquoi ne pas utiliser une structure de données dynamique extensible? Cela semble beaucoup plus simple que impliquant le disque.

Edit: Il est difficile de répondre à votre question plus contexte.

Pouvez-vous préciser ce que vous entendez par « à court de mémoire »? Quelle est la file d'attente? Combien de mémoire avez-vous?

Êtes-vous sur un système embarqué avec très peu de mémoire? Ou avez-vous 2 Go ou plus de choses dans la file d'attente?

Si l'une est vraie, vous avez vraiment quelque chose à utiliser une structure de données « swappable » comme un BTree. La mise en œuvre d'une votre auto pour une file d'attente semble exagéré. Je voudrais simplement utiliser une base de données intégrée comme SQL Lite.

Si aucun de ceux qui nous vrai, il suffit d'utiliser un vecteur ou une liste chaînée.

Edit 2: Vous n'avez probablement pas besoin d'un BTree ou une base de données. Vous pouvez simplement utiliser une liste chaînée de pages. Mais, Je dois demander: est-ce nécessaire

Ou, si vous êtes prêt à des choses de processus non en série, pourquoi ne pas avoir des fils de lecteur multiples tout le temps?

En fin de compte, je ne pense pas que votre proposition est la voie à suivre.

Vous pouvez inclure Berkley db java édition pour garder les éléments de file d'attente dans les fichiers.

Vous pouvez regarder par exemple travailler ici: http://sysgears.com/articles/lightweight -fast-file d'attente persistante en utilisant java-db-berkley-

Hope this helps

Le plus performant et GC solution amicale que j'ai trouvé maintenant est Chronique Queue . Il a extrêmement faible latence d'écriture, de l'ordre de dizaines de nanosecondes, plusieurs grades de grandeur inférieur à celui MapDB ou SQLite.

  

MapDB fournit des cartes concurrentes, ensembles et Queues soutenu par le stockage sur disque ou hors segment de mémoire. Il est un moyen rapide et facile à utiliser le moteur de base de données intégré Java.

https://github.com/jankotek/MapDB

http://www.mapdb.org/

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top