2009-04-03 7 views
5

J'ai un problème de synchronisation du traitement de plusieurs threads sur plusieurs serveurs différents pour un service Java sous Windows.Java: synchronisation des threads sur plusieurs serveurs

Dans cette application, plusieurs messages d'extraction de threads grand public sont extraits de la même file d'attente JMS. Les messages arrivent en groupes de 3 ou 4, et je dois m'assurer que les messages dans chaque groupe sont traités complètement en série. J'ai besoin d'une sorte de mécanisme de synchronisation pour m'assurer que si thread1 retire un message, puis thread2 tire le prochain message de ce groupe, thread2 attend thread1 pour terminer le traitement avant de commencer à traiter son message.

Des suggestions sur les mécanismes de synchronisation distribués pour les threads? Tout type de solution serait bon (solutions JMS, mise en cache distribuée, etc.)

Remarque: le fournisseur JMS que nous utilisons est ActiveMQ.

Répondre

7

ActiveMQ prend en charge message groups ce qui, littéralement, devrait être exactement ce dont vous avez besoin.

+0

J'ai regardé les brièvement. Savez-vous ce qui se passe avec les groupes de messages si vous créez continuellement de nouveaux groupes? Est-ce que le hachage interne continuerait à croître? Y at-il un moyen de "supprimer" ou "expirer" un groupe, afin que le groupe ne reste pas en mémoire pour toujours? Merci pour la réponse, btw. –

+0

Vous pouvez fermer des groupes de messages (c'est détaillé sur la page que j'ai liée). Cependant, je ne suis pas sûr de la création de nouveaux groupes, c'est probablement pour vérifier comment cela se fait directement à la source. – andri

1

Y a-t-il quelque chose comme un ID de groupe dans les en-têtes de message? Si c'est le cas, un consommateur peut créer un Selector pour traiter le groupe en séquence. L'attribution d'un groupe à un consommateur particulier peut être effectuée en hachant l'identifiant de groupe, ou ils peuvent activement se coordonner en utilisant un protocole de consensus comme Paxos ou synchronie virtuelle (avec les messages envoyés sur une file d'attente séparée) .

+0

Chaque groupe possède un champ "ID de groupe", qui peut être utilisé pour les regrouper tous. Toutefois, cet ID de groupe provient d'une partie externe, de sorte que les consommateurs ne connaîtront pas l'ID avant d'avoir reçu le premier message. –

+0

Vous ne savez pas si cela vous donne des informations utiles. Je suis un utilisateur intermédiaire de JMS, donc je n'ai pas encore travaillé avec des sélecteurs. –

7

Vous pouvez envisager d'utiliser les verrous distribués Hazelcast. Super léger, facile et open source.

java.util.concurrent.locks.Lock lock = Hazelcast.getLock ("mymonitor"); 
lock.lock(); 
try { 
// do your stuff 
}finally { 
    lock.unlock(); 
} 

Cordialement,

-talip

Hazelcast - Open Source Distributed File d'attente, Carte, Set, Liste, verrouillage

Questions connexes