2010-05-13 6 views
8

Supposons que vous ayez une file d'attente JMS et que plusieurs consommateurs surveillent la file d'attente des messages. Par exemple, vous définissez une propriété à afficher dans l'en-tête de votre message JMS, targetConsumer. Par exemple, vous définissez une propriété à inclure dans votre en-tête de message JMS: message selectors.JMS - Comment les sélecteurs de messages fonctionnent-ils avec plusieurs consommateurs de files d'attente et de sujets?

. Votre sélecteur de message, que vous appliquez au consommateur connu sous le nom, A, est quelque chose comme WHERE targetConsumer = 'CONSUMER_A'.

Il est clair que le consommateur A va maintenant saisir les messages avec la propriété définie comme dans l'exemple. Les autres consommateurs seront-ils conscients de cela? IOW, un autre consommateur, non contraint par un sélecteur de message, saisira-t-il les messages CONSUMER_A, s'il regarde la file d'attente avant le consommateur A? Ai-je besoin d'appliquer des sélecteurs de message comme, WHERE targetConsumer <> 'CONSUMER_A' aux autres?

Je suis RTFMing et de recueillir des données empiriques maintenant, mais j'espérais que quelqu'un pourrait savoir sur le dessus de leur tête.

Répondre

7

Lorsque plusieurs consommateurs utilisent la même file d'attente, les sélecteurs de message doivent être configurés correctement sur ces consommateurs afin qu'il n'y ait pas de conflit lors de la détermination du consommateur prévu. Dans le cas des beans pilotés par message (un consommateur de messages JMS), le sélecteur peut être spécifié dans le fichier ejb-jar.xml, ce qui permet de faire la configuration au moment du déploiement (au lieu de l'inverse). vue de la spécification du sélecteur de message pendant le développement).

Édition: Dans la réalité, cela aurait du sens lorsque différents consommateurs sont chargés de traiter des messages contenant les mêmes en-têtes (souvent générés par le même producteur) écrits dans la même file d'attente. Par exemple, des sélecteurs de message pourraient être utilisés dans une application de négociation, pour différencier des ordres d'achat et de vente, lorsque le producteur est incapable d'écrire les messages JMS sur deux files d'attente d'achat et de vente séparées.

+0

Je ne vois pas comment cela répond à la question. Voulez-vous dire que dans le scénario décrit ci-dessus, un consommateur de message sans contrainte va saisir les messages CONSUMER_A? –

0

Oui, un autre consommateur qui n'utilise aucun sélecteur de message recevra un message destiné au consommateur A (ou d'ailleurs un message au-dessus de la file d'attente). Ainsi, lors du partage d'une file d'attente, les applications grand public doivent être disciplinées et choisir uniquement les messages qui leur sont destinés.

0

Le 'premier' consommateur de message JMS d'une file d'attente récupérera le message si le sélecteur correspond. Ce qui signifie en premier lieu est un détail d'implémentation (qui peut être circulaire, en fonction de la priorité ou de la proximité du réseau). Donc, lorsque vous utilisez des sélecteurs dans les files d'attente, vous devez vous assurer que ces sélecteurs ne se chevauchent pas.

Plus formellement: aucun message doit exister qui correspond à 2 sélecteurs sur la même file d'attente

Ceci est encore un autre inconvénient des files d'attente par rapport aux sujets - dans la pratique, vous devriez toujours envisager d'utiliser d'abord les sujets. Avec un sujet, chaque consommateur correspondant reçoit le message.

Questions connexes