Je suis un administrateur de base de données, donc cela donne du goût à ma réponse, mais voici ce que je ferais :
- Si vous utilisez SQL 2005+, utilisez Service Broker pour stocker les messages dans la base de données plutôt que de les stocker dans une table. Vous obtenez un mécanisme de mise en file d'attente avec cela, vous pouvez donc vous débarrasser de MSMQ. Vous aurez également une table, mais elle ne stockera que le descripteur de conversation (essentiellement, un pointeur vers le message) ainsi que le nombre de tentatives de ce message. Enfin, vous aurez besoin d'une sorte de "boîte aux lettres mortes" où vont les messages qui atteignent votre seuil de nouvelles tentatives.
- Dans votre code de traitement des messages, procédez comme suit :
- Commencer une transaction
- Recevoir un message hors de la file d'attente
- Si le nombre de tentatives est supérieur au seuil, déplacez-le vers la boîte aux lettres morte et validez
- Incrémenter le compteur sur le tableau pour ce message
- Traiter le message
- Si le traitement a réussi, validez la transaction
- Si le traitement a échoué, placez un nouveau message dans la file d'attente avec le même contenu, puis validez la transaction
Notez qu'aucune restauration n'est prévue. Les restaurations dans Service Broker peuvent être mauvaises; si vous annulez 5 fois sans succès de réception, la file d'attente sera désactivée pour la mise en file d'attente et la sortie de file d'attente. Mais vous voulez toujours avoir des transactions pour le cas où votre processeur de message meurt au milieu du traitement (c'est-à-dire que le serveur tombe en panne).