J'ai une application qui utilise MSMQ pour le traitement asynchrone de certaines choses.
J'utilise WCF pour mettre des messages sur la file d'attente et avoir un écoute de WCF MSMQ (un service Windows) pour recevoir des messages et traiter avec eux. < / P>
Mon problème est de garder cette stable. Quelle est la bonne façon de traiter (par exemple) le serveur de files d'attente (qui est une boîte séparée) en descente? L'autre jour de ce qui s'est passé et que le service reste assis là - aucune exception n'a été lancée, il arrête de recevoir des messages. Je voudrais que cela jette une exception lorsque le serveur de file d'attente est tombé en panne, puis réessayez de vous connecter jusqu'à ce qu'il puisse être capable. P>
J'ai également remarqué que l'exécution d'un "arrêt" sur le service provoque souvent des causes. Il doit accrocher pendant un certain temps avant de finalement s'arrêter. P>
Tout code suggère ou des critiques seraient les bienvenus. Évidemment j'ai fait google pour cette première, mais la plupart des exemples me montrent à peu près ce que j'ai déjà et j'aimerais rendre mon système plus robuste que ça. P>
J'ai actuellement: P>
(Remarque: imyexampleverservicecontract est mon contrat de service WCF et la queueHandler est ce qui les implémente) p>
3 Réponses :
Je ne sais pas pourquoi votre hôte de service est suspendu, mais je peux certainement penser à quelques choses à essayer de le rendre plus fiable: p>
a) il peut les envoyer avec succès et p>
b) que les messages sont ramassés et traités par le service de santé local de la WCF en écoutant cette file d'attente. Qui pourrait être utilisé pour détecter certaines conditions d'erreur possibles. P>
L'événement fauté a l'air utile. Je suppose que vous croyez que cela n'entrera pas dans cet état si le serveur MSMQ échoue cependant? (Comme vous recommandez le service "ping"), le service "ping" sonne comme un bon travail pour tester la disponibilité des serveurs, je pensais simplement qu'il y aurait eu quelque chose d'introduit dans la WCF qui traiterait de cela pour moi. Quoi qu'il en soit, je vais essayer l'événement fauté un essai, alors merci de me faire remarquer dans sa direction.
Pour être honnête, je ne sais tout simplement pas avec certitude, pourquoi j'ai recommandé les deux options :)
L'auditeur de WCF MSMQ sous-jacent est probablement en train de lancer une exception avant de ne jamais atteindre votre code. Ce qui est une situation frustrante car elle ressemble à rien ne se passe et que le pire de votre message est tombé. Activez Traçage du service WCF dans votre fichier de configuration de service. p>
Maintenant, lorsque vous exécutez votre service, il vous tracera et vous donnera plus de détails. Au lieu de t'attarder vos yeux à travers le XML, présentez ce fichier journal avec la visionneuse MS Service Trace. P>
Quand j'avais ce problème, je recevais "System.ServiceModel.Protocolexception": P>
Un message MSMQ entrant contenait des informations non valides ou inattendues .NET. Le message ne peut pas être reçu. Assurez-vous que l'expéditeur utilise un contrat de service compatible avec une session de session correspondante *. Mon contrat de service avait été modifié pour avoir la session d'attributMode = sessionMode.Required, mais les clients n'envoient pas de messages avec une transaction. P> blockQuote>
Merci pour l'idée, je vais allumer le traçage et lui donner une allée.
Bien que WCF ajoute des fonctionnalités froides à MSMQ, vous obtiendrez parfois votre objectif tout aussi facilement et avec un contrôle plus important si vous codez manuellement le traitement MSMQ. p>
Si vous traitez manuellement votre file d'attente, vous pourrez voir exactement ce qui se passe et traiter avec les messages d'idées qui sont lancés, par exemple. Vous serez en mesure d'attraper MessageQueUserRorCodes tels que la QueueNotFoundNound ou machinénotfound. P>
Malheureusement, cela signifie également la gestion de la file d'attente des messages antipoison, ajoutant des transactions au traitement, ajoutant une période de délai d'attente à la file d'attente, etc. Toutes les choses que la WCF prend bien soin de vous. P>
Le principal avantage de l'utilisation de la WCF est que vous pouvez alors utiliser consistait à instancier une application Web, plutôt que d'avoir un service Windows continuellement. Si vous n'utilisez pas cet avantage, je ne vois pas vraiment d'avantage pour WCF - il suffit de résumer beaucoup de ce que vous devez toucher et à voir. P>
Juste comme une note latérale; Peut-être que vous pouvez vérifier si le serveur est disponible lorsque vous mettez des messages sur la file d'attente? Si le serveur est disponible pour mettre les messages sur la file d'attente, alors l'auditeur sera en mesure de les traiter immédiatement. P>