Question

Est-il possible d'avoir plusieurs écouteurs pour les messages acheminés par MSMQ?

La WCF semble tout encadrer en termes de services, faisant de la communication une affaire point à point. Je souhaite utiliser une file d'attente de messages pour mettre en tampon le trafic entrant d'un autre processus qui enregistre les journaux dans une base de données.

Il peut y avoir un certain nombre de processus intéressés par la surveillance du trafic entrant, ce qui plaide positivement pour le modèle Observer, mais je ne vois pas comment exprimer le modèle Observer, du moins en n'utilisant pas MSMQ via WCF.

Quelqu'un peut-il me conseiller à ce sujet?

Quelques raisons de l’importance de mon intérêt, qui peuvent également servir à illustrer le problème: j’ai un service Windows qui accepte les demandes de connexion de petites boîtes noires sur le terrain. Il configure les prises et les boîtes noires envoient des messages décrivant les événements annotés avec les positions GPS dans le temps et dans l’espace.

J'analyse les paquets de messages du flux de socket et les envoie via MSMQ à un autre processus qui filtre les doublons et les écrit dans une table de base de données.

Le calcul incrémental en réponse au trafic entrant peut tirer parti de tout post-traitement, et les outils utilisateur émettent des notifications à l'utilisateur également en réponse au trafic entrant.

Donc, j'aimerais vraiment qu'un processus envoie les messages et que plusieurs les reçoivent. L'un de ces destinataires est responsable de l'analyse du contenu du paquet et de la transcription du message dans une base de données; c’est un candidat évident à la responsabilité de supprimer finalement le message de la file d’attente, mais la question de savoir comment s’assurer qu’il s’agit du dernier gestionnaire à traiter le message.

Était-ce utile?

La solution

Je ne pense pas que MSMQ soit conçu de manière appropriée pour gérer cette situation en soi. Il n'y a que 2 choses que vous pouvez faire pour un message - Peek () ou Get (). Autant que je sache, il n’existe pas de moyen efficace de savoir si un message a été traité par tous les gestionnaires.

Ce qui pourrait fonctionner, c’est que votre processus de transcription du message soit l’observateur et que le message (en utilisant éventuellement l’architecture .NET Event) soit publié pour tous les observateurs intéressés avant de transcrire le message et de l’écrire dans la base de données. Cela garantirait que tous les observateurs intéressés voient le message et que le message est correctement écrit dans la base de données.

Autres conseils

Je pense que vous avez besoin d'un canal Publier-S'abonner :

.
  

Comment l'expéditeur peut-il diffuser un événement à tous les destinataires intéressés?    Envoyez l'événement sur un canal de publication-abonnement, qui fournit une copie d'un fichier particulier.   événement à chaque récepteur.

     

Un canal de publication / abonnement fonctionne comme ceci: il possède un canal d'entrée   qui se divise en plusieurs canaux de sortie, un pour chaque abonné.   Quand un événement est publié dans le canal, le poste de publication / abonnement   Channel fournit une copie du message à chacun des canaux de sortie.   Chaque canal de sortie ne compte qu’un seul abonné, qui n’est autorisé à   consommer un message une fois. De cette manière, chaque abonné ne reçoit que le   message une fois et les copies consommées disparaissent de leurs canaux.

Ce modèle est implémenté au-dessus de MSMQ par MassTransit et NServiceBus .

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