2009-09-02 12 views
2

Nous avons une application MVC qui lit les données de MSMQ. Nous essayons de trouver un moyen de lire le message de la file d'attente et de le retirer de la file d'attente seulement si l'utilisateur a effectué une opération réussie dans la file d'attente. Le message doit rester dans la file d'attente jusqu'à ce que l'utilisateur termine le traitement, le message ne doit pas être disponible pour quelqu'un d'autre jusqu'à ce que l'utilisateur qui traite l'objet de message a terminé l'opération.Suppression du message de la file d'attente uniquement si l'utilisateur effectue une opération

Y a-t-il une propriété pour qu'un objet Message soit défini comme étant Peeked, ce qui ne permettra plus la lecture de ce message jusqu'à ce qu'il soit remis dans la file d'attente ou retiré de la file d'attente?

Nous ne savons pas si l'utilisation de MSMQ est une bonne idée dans ce cas?

+0

Ceci est similaire à quelque chose que j'été mise en place. La façon dont je l'imaginais, les éléments sont ajoutés à la file d'attente (la file d'attente est une table de base de données), puis quand ils sont captés par un processus, ils sont marqués comme "En cours" et horodatés. table. Une fois le processus terminé, il supprime l'élément de la table. Pour récupérer des plantages ou des éléments orphelins, un autre processus intervient à chaque minute et efface le drapeau "En cours" de tout élément dont l'horodatage date de plus de 15 minutes, ce qui est bien plus long que ce qui serait nécessaire pour terminer. Est-ce que c'est comme ce que vous proposez? – SqlRyan

+0

C'est exactement ce que je cherche. Si le processus ne parvient pas à terminer, le message doit être ajouté à la file d'attente ou le message doit être marqué comme disponible pour être récupéré ultérieurement. Pourriez-vous s'il vous plaît suggérer si l'utilisation de MSMQ dans ce cas est une bonne option. Pourriez-vous s'il vous plaît laissez-moi savoir ce que vous avez utilisé dans votre configuration? – Balaji

Répondre

1

Il semble que vous ayez besoin d'utiliser vos files d'attente en mode transactionnel. Ensuite, votre client peut recevoir un message, le traiter et puis valider la transaction, à quel point le message sera finalement retiré. Pendant que la transaction est active, les autres clients ne verront pas le message: il sera conservé en réserve jusqu'à ce que la transaction soit terminée ou avortée.

Cet article MSDN a une vue d'ensemble décent de modèles d'utilisation pour la messagerie fiable avec MSMQ:

http://msdn.microsoft.com/en-us/library/ms978430.aspx

+0

Dans ce cas, je devrai passer l'objet de transaction à la couche d'interface utilisateur. Est-ce une bonne idée de le faire? Nous n'avons jamais utilisé de transactions MSMQ et toute contribution nous serait d'une aide précieuse. – Balaji

+0

Sans en savoir plus sur votre application, je ne peux pas dire avec certitude si la logique de transaction dans votre couche de vue est une bonne idée ou non, mais je recommanderais généralement contre. – rcoder

+0

Dans notre application, nous lisons un message de la file d'attente. L'objet message est affiché sur la vue de l'utilisateur. L'utilisateur peut changer les valeurs qui sont frappées lors de la sauvegarde. À ce stade, le message est placé dans une autre file d'attente. Nous voulons nous assurer que le message n'est pas perdu dans ce processus de lecture des données de la file d'attente et de faire une opération de sauvegarde (qui est déclenchée par l'utilisateur). Pourriez-vous suggérer s'il est approprié d'utiliser une transaction dans ce cas? – Balaji

0

La file d'attente est la bonne idée. Votre approche de "laisser dans la file d'attente, verrouillé, mais toujours disponible" est fausse.

Vous pouvez avoir besoin de plusieurs files d'attente.

  1. Processus A enqueues quelque chose dans la file d'attente 1

  2. Processus B dequeues de la file d'attente 1 et commence à travailler.

    • Si B est réussi, c'est tout. Sinon, il est mis en file d'attente ailleurs (peut-être la même file d'attente, voire la file d'attente 2) pour le travail de suivi.

Si elle est retournée dans la file d'attente 1, B trouver à nouveau, par la suite. Si elle est passée à une autre file d'attente, un autre processus effectue le nettoyage, la consignation, la correction d'erreur ou autre, remettant éventuellement quelque chose dans la file d'attente 1.

Une file d'attente n'est pas une base de données - il n'y a rien de regarde-moi, je suis en cours de traitement ").

Une file d'attente est une mémoire transitoire. Quelqu'un écrit, quelqu'un d'autre lit, et c'est tout.


Si vous voulez la fiabilité, lisez ceci: http://msdn.microsoft.com/en-us/library/ms978430.aspx

Et ceci: http://blogs.msdn.com/shycohen/archive/2006/02/20/535717.aspx

Et ceci: http://www.request-response.com/blog/PermaLink,guid,03fb0e40-b446-42b5-ad90-3be9b0260cb5.aspx

La fiabilité est une caractéristique de la file d'attente, pas votre application. Vous pouvez faire une "lecture récupérable". C'est une transaction qui fait partie de l'API de file d'attente.

+0

Si vous êtes opposé à la méthode «laissez-le dans la file d'attente, mais verrouillez-le», comment gérez-vous les plantages applicatifs ou la perte de connectivité, au cas où votre processeur ne fonctionnerait plus? Je suis préoccupé par le fait que les éléments que j'ai retirés de la file d'attente pour que je puisse les traiter ne retourneront jamais dans la file d'attente dans le cas où ce n'est pas terminé. Je peux coder pour les exceptions et gérer le crash, mais je crains de manquer un cas limite. – SqlRyan

+1

C'est exactement le problème que nous avons. Comment nous assurer que le message n'est pas perdu une fois que nous avons lu le message de la file d'attente. – Balaji

Questions connexes