2009-04-10 9 views
4

Comment gérer les messages empoisonnés lorsque je n'utilise pas WCF? Le code ci-dessous crée une boucle, et j'étais curieux de savoir si MSMQ fournissait un système pour gérer automatiquement les messages empoisonnés.MSMQ Poison Message Handling

MessageQueue mq = new MessageQueue(@".\Private$\My/Queue"); 

while (true) 
{ 
    using (MessageQueueTransaction _transaction = 
      new MessageQueueTransaction()) 
    { 
     _transaction.Begin(); 

     try 
     { 
      Message msg = mq.Receive(_transaction); 

      //HandleMessage(msg); 
      throw new Exception("Kaboom!");    

      _transaction.Commit(); 
     } 
     catch (Exception ex) 
     { 
      _transaction.Abort(); 
     } 

    } 
} 

Répondre

3

Je ne crois pas qu'il existe un moyen simple de gérer les messages empoisonnés en utilisant des classes System.Messaging brutes. Je pense que la solution la plus simple est de définir la propriété "TimeToBeReceived" sur un message, mais ce n'est pas parfait, car vous risquez de perdre des messages valides si le récepteur est hors ligne. J'ai lu quelque part que vous pouvez avoir un vrai traitement de message empoisonné dans MSMQ en utilisant PInvoke, mais n'a pas pu trouver de ressources à ce sujet.

J'ai trouvé cet article avec quelques idées sur la façon de gérer manuellement les messages empoisonnés. Il pourrait donner quelques idées:

http://www.cogin.com/articles/SurvivingPoisonMessages.php

+0

droit donc je devrais mettre en œuvre mon propre système. – James