2009-01-08 7 views
3

J'ai un service .NET qui utilise le client ActiveMQ. J'ai implémenté un MessageListener avec une connexion traitée pour consommer les messages.Comment préserver l'ordre des messages lorsque vous recevez des messages d'ActiveMQ?

Parfois, je reçois des messages dans un ordre différent dans lequel ils ont été placés dans la file d'attente.

Avez-vous eu tort d'utiliser MessageListner? Y a-t-il un moyen de préserver l'ordre des messages?

FYI: Un producteur place des messages dans la file d'attente et un consommateur extrait les messages de la file d'attente.

+0

Veuillez consulter ce fil pour un peu plus d'informations sur le problème http://stackoverflow.com/questions/269363/activemq-net-client-locks-up – HitLikeAHammer

Répondre

1

Plus d'infos: Le serveur que j'appelle est un tiers et je n'ai aucun contrôle sur les messages qu'il envoie. Je sais, en fonction de l'ID du message, qu'ils sont placés dans le bon ordre. En outre, dans ce système, il existe une différence entre ACK et Acknowledge. L'accusé de réception est reçu lorsque mon message d'origine est placé dans la file d'attente "sortante". Je surveille ensuite une file d'attente «entrante» pour les réponses. Je reçois généralement un "Acknowledge" suivi d'un "Pass" ou un "Fail". L'ID de corrélation pour ces messages est l'ID de message de l'ACK. J'avais initialement utilisé un écouteur de message et répondu à un événement OnMessge. J'ai abandonné cette approche après avoir réalisé que, en utilisant cette méthode, les messages sont délivrés de manière asynchrone et donc sans ordre particulier. Donc, j'ai changé mon code pour interroger en utilisant un timer (System.Threading.Timer) pour appeler le consommateur.Recevoir() et recevoir un message à la fois. Cela fonctionne comme je le veux.

J'ouvre le consommateur une fois lorsque le service démarre et je continue d'interroger les messages.

0

Pourquoi l'ordre des messages est-il important? Un MessageListener ne devrait pas avoir à s'en soucier.

Si vous avez besoin d'un ID de corrélation pour faire correspondre une réponse avec une requête particulière, c'est une autre question. C'est ce que tu veux dire?

+0

Un message est envoyé à un serveur via la file d'attente et le serveur envoie retour des réponses à ce message dans une autre file d'attente. Je reçois 2 réponses, d'abord un message qui dit "Accepter" puis un qui dit "Passer" (ou Echouer). Tous ont le même ID de corrélation. Parfois, je reçois le message "Acknowledge" en dernier. – HitLikeAHammer

+2

mauvaise conception, IMO. L'ACK semble être synchrone, rien de plus que "Nous avons reçu votre demande et elle sera traitée". J'aurais un processeur de synchronisation comme une servlet et je mettrais la requête dans la file d'attente. Ensuite, c'est juste une paire req/res, et l'ID de corrélation signifie quelque chose. – duffymo

1

Vous ne devriez rien faire pour maintenir l'ordre; c'est l'une des choses qu'une file de messages fait pour vous. Je pense que si vous avez un seul consommateur qui écoute la file d'attente et qu'il traite les messages dans le désordre, alors vous avez trouvé un bug ou les messages ne sont pas mis en file d'attente dans l'ordre que vous pensez qu'ils sont.

En outre, il y a this question du ActiveMQ FAQ qui pourrait aider.

Modifier: À la lecture des commentaires sur duffymo's answer, il semble que vous êtes un peu overengineering. En général, une file d'attente de messages comme ActiveMQ, MQ Series, joram, etc. a deux caractéristiques: ils délivrent les messages dans le même ordre que celui dans lequel ils sont placés et garantissent la livraison des messages. L'envoi d'un message ACK distinct est redondant; c'est un peu comme valider une transaction de base de données, puis interroger la même information pour vérifier que la base de données l'a réellement stocké.

Cela étant dit, votre serveur est-il multithread? Si c'est le cas, il peut mettre en file d'attente la réponse avant et mettre en file d'attente l'ACK.

0

Tout ce que Jason vient de dire. Quelques autres choses à faire attention. Vous gardez le consommateur ouvert pour beaucoup de messages, n'est-ce pas? Vous n'êtes pas en train de créer un consommateur pour quelques messages puis de le fermer? Seule la fermeture d'un consommateur entraîne le retour des messages associés à un consommateur dans une file d'attente susceptible de rompre l'ordre.

Est-ce lié aux rollbacks? (Êtes-vous annuler toutes les transactions?). Enfin, vous pouvez toujours assurer la commande en utilisant un Resequencer pour réorganiser les choses pour vous.

Questions connexes