2015-04-27 7 views
3

J'utilise MassTransit (et RabbitMq pour les files d'attente) pour effectuer un traitement séquentiel de chaque message qui implique un certain nombre d'étapes. Je veux être en mesure de stocker une information de "traitement-état" quelque part dans IConsumeContext<MyMessage> qui sera liée à chaque message particulier, de sorte que, par exemple, si un traitement de message échoue à l'étape 2, lors de la prochaine tentative, je continuerais à partir de l'étape 2 et ne répétez pas l'étape 1 à nouveau.MassTransit - Où stocker l'état entre les tentatives

Est-ce possible?

Certains des moyens possibles que je vois est de changer le message lui-même, mais je ne sais pas si c'est une façon standard de faire les choses.

En outre, il y a une propriété Headers sur le message, mais je ne suis pas sûr de quoi est-ce.

Quelqu'un at-il déjà fait cela?

MISE À JOUR:

Je pourrais simplement utiliser try/catch blocs avec des boucles et de retarder l'intérieur, là aussi, mais je ne sais pas si ce serait mieux d'éviter cela.

Répondre

2

La meilleure façon de gérer quelque chose comme ceci est une Saga via Automatonymous. Faites des tentatives explicites et faites partie de votre domaine.

Nous effectuons déjà des tentatives au niveau inférieur, si une exception est levée, elle est renvoyée dans la file d'attente et réessayée jusqu'à ce que des tentatives maximales soient effectuées. Ensuite, le message est lancé dans la file d'attente d'erreurs. Vous pouvez également appeler le RetryLater() sur le contexte. Il y a un nombre de tentatives dans l'en-tête pour des choses comme le comptage des tentatives déjà.