Comment fonctionne le JMS en interne?

j'ai fait des recherches sur diverses technologies de communication / architectures/modèles / implémentations (lire: mots à la mode) y compris les Services Web (WCF, Axis2), ESBs, SOA, et je voulais en savoir plus sur JMS en ce qui concerne la messagerie.

sur le plan conceptuel, JMS semble simple. Selon moi, il s'agit d'un courtier intermédiaire qui gère les messages des éditeurs et les achemine aux abonnés appropriés. Ceci est fait en faisant la file d'attente des messages au fur et à mesure qu'ils sont publiés, et en les sont reçus.

<!-Question 1: ma compréhension de base du JMS est-elle correcte?

une des choses qui me dérange quand je lis sur les technologies, c'est quand un certain niveau de gesticulation (intentionnelle ou non) est fait à propos d'une fonctionnalité.

D'après mes connaissances de base, un fournisseur JMS doit être en cours d'exécution pour envoyer ou recevoir des messages. Ma supposition sur la publication est que le fournisseur de JMS attend simplement jusqu'à ce qu'un message soit publié, puis stocke dans une file d'attente (mémoire ou base de données, selon l'implémentation). Cependant, je ne suis pas tout à fait sûr de la façon dont fonctionne receive.

Question 2: reçoit-il (habituellement) un bloc si aucun message n'est disponible?

question 2b: si oui, comment obtient-on le blocage? Le client Recherche-t-il continuellement des messages? Le serveur tout simplement pas répondre jusqu'à ce qu'un message est publié (comment cela fonctionne, sans calendrier?) Le fournisseur de lancer un appel à le destinataire?

Question 2c: dans la négative, comment s'assure-t-on que les messages sont reçus en temps opportun, sans affecter le rendement?

la description de base semble pencher vers un seul fournisseur de JMS pour s'assurer que les messages sont gérés centralement et non perdus. Je peux voir la mise à l'échelle étant un problème.

Question 3: Quelle est l'échelle de JMS?

lors de la mise à l'échelle, je peux voir qu'il y a des complexités pour assurer qu'un seul le message est livré à tous les abonnés appropriés, quel que soit le serveur physique qui reçoit le message.

Question 3b: comment la mise en œuvre d'un JMS assure-t-elle une livraison fiable dans un environnement gradué?

veuillez noter que bien que ces questions soient liées au JMS, elles s'appliquent probablement à toute infrastructure de messagerie. Je me félicite des réponses spécifiques aux JMS ainsi que de celles qui sont plus générales ou même spécifiques à une autre technologie.

30
demandé sur Travis 2011-05-10 19:03:34

5 réponses

j'essaie de répondre à quelques questions basées sur mon expérience sur JMS.

Réponse 1: - JMS est L'API Java Message Service; elle fournit une interface uniforme aux clients Java pour accéder au cadre de messagerie. Sous L'API JMS se trouve un fournisseur de messagerie compatible JMS, par exemple WebSphere MQ provider. JMS prend en charge le transport d'une charge utile sur n'importe quel protocole de messagerie vers des destinations à savoir. La file d'attente et le Sujet. Ce sont les bases de JMS.

comment reçoit-on du travail? JMS spécification fournit deux classes:- MessageConsumer et MessageListener. MessageConsumer la classe permet à un client JMS de recevoir de façon synchrone les messages JMS en appelant l'un de ses receive() méthode. Cet appel bloquera le thread jusqu'à ce qu'un message soit reçu. Autrement, la réception asynchrone peut être faite en enregistrant un objet de MessageListenerMessageConsumer. Il est JMSProvider qui savent qu'un message est arrivé à sa destination locale et son travail est de livrer les messages d'interrogation message consommateurs de fil ou de non-interrogation de message enregistré thread d'écoute.

réponse 2: - MessageConsumer API a deux variantes de receive: receive() et receive(long timeout). Cette dernière variante permet MessageConsumer bloc de thread jusqu'à ce que le message arrive dans une période de temps d'arrêt spécifique ou bien il chronomètre.

différents cadres de messagerie peuvent implémenter la fonction de blocage de différentes façons. Comme les objets JMS sont des objets administrés par JNDI et que les objets proxy spécifiques au fournisseur sont retournés à JMS client, cela signifie que le client n'est pas au courant de la façon dont le blocage se produit en arrière-plan. Un cadre de messagerie particulier peut choisir message consumer thread polling après une période de temps particulière. Il peut aussi choisir de bloquer jusqu'à l'envoi de la notification.

Je ne suis pas sûr si vous cherchez réponse pour un cadre de messagerie conforme JMS particulier?

réponse 3: - Je suppose que par JMS scaling vous voulez dire capacité d'avoir de nombreux éditeurs / abonnés, de nombreuses destinations sur plusieurs machines physiques. La mise à l'échelle de JMS nécessite le soutien du fournisseur de messagerie sous-jacent pour soutenir une sorte de regroupement/échec. En tant que telle, la spécification JMS ne prend pas en charge l'évolutivité. Corrigez-moi si je me trompe sur ce point? Par exemple, j'ai travaillé sur WebSphere MQ conforme JMS qui fournit un support de clustering.

16
répondu ag112 2017-05-27 01:26:53

commençons par les terminologies. Vous ne pouvez pas dire JMS Provider must be running car provider est une entité qui a construit le serveur JMS et c'est le serveur JMS qui doit fonctionner. Par conséquent, lorsque nous disons JMS, nous entendons un ensemble D'API (interfaces plus techniques) que les fournisseurs mettent en œuvre. Donc, fondamentalement, les fournisseurs écrivent leur propre implémentation JMS. Par exemple, Active MQ is a JMS server qui est fourni par Apache(provider)

mon hypothèse sur la publication est que le fournisseur JMS attend simplement qu'un message soit publié, puis le stocke dans une file (mémoire ou base de données, selon l'implémentation).

Vrai dans une certaine mesure. Il existe différents modèles qui sont suivis. Le serveur JMS garde une socket ouverte. Chaque fois qu'un client expéditeur doit envoyer un message, il ouvre simplement une connexion à la socket et envoie le message. Le comportement de receive est tout à fait différent. Vous avez pull et appuyer sur. Dans push server poussera les messages vers le client récepteur en direct dès qu'il reçoit le message. Il est également appelé mode asynchrone. Dans pull model client receiver envoie la requête au serveur pour obtenir des messages ( mode synchrone).

reçoit-il (typiquement) un bloc si aucun message n'est disponible?

comme je l'ai mentionné au point précédent, cela dépendra du modèle vous êtes en utilisant. Récepteur bloqué dans le modèle d'extraction (synchrone recevoir). Aussi ce qui se passe dans session thread, pas le thread principal.

si oui, comment obtient-on le blocage? Le client Recherche-t-il continuellement des messages?

Oui, le client sondera en permanence en cas de modèle pull. Généralement, il y a un délai après lequel le client sera terminé.

Si non, comment s'assurer que les messages sont reçus en temps opportun, sans impact sur les performances?

Utiliser mode asynchrone. Il vous suffit de vous inscrire MessageListener et il recevra un message sur c'est substituée onMessage (Message msg) quand il y a disponibilité des messages sur le serveur.

Question 3: Quelle est l'échelle de JMS?

C'est vraiment une question pour les fournisseurs de s'inquiéter. Quand vous dites un message est reçu par tous les abonnés vous reportant à la section PUBSUB modèle de communication (Autre être PTP). Dans PUBSUB le message envoyé à un thème sera livré à tous les abonnés inscrits à ce thème.

Question 3b: comment la mise en œuvre d'un JMS assure-t-elle une livraison fiable dans un environnement gradué?

Fiabilité? Pas toujours. Encore une fois, cela dépend du cas d'utilisation. Vous pouvez avoir persistantes ainsi non persistants Messages. En cas de messages persistants, les messages sont stockés dans DB (file ou autres) et sa livraison est assurée. En cas de messages non persistants, il n'y a pas de garantie. Le serveur peut entraîner la perte de messages.

3
répondu Aniket Thakur 2017-05-27 01:21:16

JMS supporte la consommation de messages avec une méthode synchrone (réception avec et sans temps mort bloquant votre thread) ou avec un callback piloté par un événement (async message listener)).

vous pouvez décider quelle méthode convient le mieux à vos besoins, mais vous devrez peut-être aussi jeter un coup d'oeil à la mise en œuvre réelle. Par exemple, certaines implémentations JMS font un aller-retour réseau pour le receive() et sont donc mieux utilisées avec un timeout ou avec l'écouteur.

avec le message le comportement du fil d'écoute et l'interruption de la réception du message ne sont pas contrôlés aussi facilement qu'avec un appel de réception de blocage. Typiquement la plupart du contrôle est réalisé en ayant votre propre pool de blocage des appels receive() avec des timeouts, dispatching à vos travailleurs.

2
répondu eckes 2012-03-26 10:54:00

je pense que la différence entre la File d'attente et le Sujet devrait être mentionnée, car il existe des différences importantes dans la façon dont les messages sont livrés.

File d'attente: un seul client recevra un message. À l'échelle, vous pouvez par exemple avoir 10 clients, tous connectés à la même file d'attente, mais un seul d'entre eux recevra un message particulier. Si aucun client n'est connecté, le message reste dans la file d'attente jusqu'à ce que quelqu'un se connecte ou que le message arrive.

Rubrique: tous les clients recevez une copie de chaque message. Généralement utilisé dans un scénario d'abonné où de nombreux paramètres sont potentiellement intéressés par chaque message. Une semelle abonné peut même être vers le bas pour un certain temps; message sera conservé jusqu'à l'abonné est nouveau ou le message. Si aucun client n'est connecté et qu'il n'y a pas d'abonnés durables, le message sera supprimé.

2
répondu Simen R 2012-11-11 12:46:55

il existe deux types de domaines de messagerie dans JMS.

  1. Ppoint- T o - Ppoint(PTP) Domaine De Messagerie
  2. Domaine De Messagerie De L'Éditeur/Abonné

dans le modèle PTP, un message est transmis à un récepteur. Ici, la file d'attente est utilisée comme un M essage O riented M iddleware ( maman).

la file d'attente est responsable de maintenir le message jusqu'à ce que le récepteur soit prêt.

dans le modèle PTP, il n'y a pas de dépendance temporelle entre l'expéditeur et le destinataire.

enter image description here


Dans Pub/Sub modèle, un message est envoyé à tous les abonnés. C'est comme la radiodiffusion. Ici, le sujet est utilisé comme un middleware orienté message qui est responsable de tenir et de livrer message.

dans le modèle PTP, il y a une dépendance temporelle entre l'éditeur et l'abonné.

enter image description here


JMS Modèle de Programmation

enter image description here

source


M essage Ddéchiré B ean (MDB)

  • le MDB est un haricot qui contient une logique commerciale. Mais, il est invoqué en transmettant le message. Donc, c'est comme JMS Receiver.
  • MDB reçoit de façon asynchrone un message et le traite.
  • le BMM reçoit un message d'une file d'attente ou d'un sujet.
  • le MDB est comme un haricot session apatride qui encapsule une logique d'affaires et ne maintient pas un État du haricot.

enter image description here

0
répondu Premraj 2017-06-19 04:49:12