J'ai besoin de créer un service qui peut traiter les demandes en file d'attente sur un intervalle de temps configuré. Par exemple aller sur le web et obtenir des données financières à partir d'un site, nous exige que nous limitons les demandes à une fois par seconde. Je suis nouveau à la WCF et je ne suis pas sûr si (1) WCF avec MSMQ un bon choix pour mettre en œuvre cela? et (2) si oui quel est le meilleur mécanisme pour faire respecter l'intervalle? un fil d'attente? une minuterie (je ne sais pas comment cela fonctionnerait).Service WCF en file d'attente qui traite toutes les X secondes
Répondre
Il n'y a rien de construit dans WCF qui vous permettrait de gérer cela explicitement, donc vous aurez toujours besoin de faire tout le travail vous-même.
Alors que votre service pourrait certainement traiter les demandes de MSMQ, les écouteurs MSMQ dans WCF sélectionneront et traiteront les messages dès que possible; vous ne pouvez pas les configurer pour traiter les messages toutes les X secondes seulement (vous pourriez faire semblant avec les bons outils, mais il me semble que ce ne serait pas très bien).
Une option si votre délai entre les demandes de traitement n'est pas très court, serait d'utiliser une file d'attente intermédiaire pour contenir les demandes en attente. C'est-à-dire que tout ce qui envoie les requêtes réelles les écrit dans une file d'attente que personne n'écoute directement (file d'attente A), alors que votre service WCF écoute sur une file d'attente différentielle (file d'attente B). Ensuite, ayez quelque chose d'autre (qui pourrait être aussi simple qu'un script exécuté depuis le planificateur de tâches) qui s'exécute une fois toutes les X secondes/minutes et déplace le message de la file A vers la file d'attente B, déclenchant ainsi le service WCF.
Ou vous pouvez simplement utiliser un service de fenêtre pour consommer les messages à la place. Si vous n'utilisez pas la fonctionnalité WCF de la consommation d'un message dès sa publication, vous n'avez probablement aucune raison d'utiliser wcf en premier lieu.
WCF et MSMQ forment une équipe géniale! Vaut vraiment le détour.
La partie que WCF ne fournit pas de la boîte est le «vérifier toutes les x secondes». La meilleure approche ici consiste à héberger votre service WCF dans un service Windows NT et disposer d'un temporisateur dans le service NT qui vérifie la file d'attente MSMQ une fois toutes les x secondes. Ne devrait pas être trop difficile à mettre en œuvre, vraiment. La beauté est la suivante: vous pouvez très facilement héberger un service WCF à l'intérieur d'un service NT - juste quelques lignes de code, et vous obtenez un contrôle complet sur ce qui se passe, et quand. Voir les documents MSDN sur How to Host a WCF service in a managed application pour plus de détails.
Ressources:
- série post blog de Tom Hollander sur MSMQ, WCF, IIS: Getting them to play nice
- Motley Queue: MSMQ and WCF Getting Started
- SOAizing MSMQ with WCF (and why it's worth it)