2009-08-21 7 views
1

J'ai une application NServiceBus pour laquelle un message donné peut ne pas être traité en raison d'un événement externe qui n'a pas eu lieu. Comme cet autre événement n'est pas un événement NSB, je ne peux pas implémenter correctement les sagas. Cependant, plutôt que de re-mettre en file d'attente le message (ce qui provoquerait une boucle jusqu'à ce que cet événement externe se soit produit), j'enveloppe le message dans un autre message (DelayMessage) et je le place en file d'attente. Le DelayMessage est détecté par un service différent et placé dans une base de données jusqu'à l'expiration de l'intervalle de nouvelle tentative. À ce stade, le service de délai remet le message dans la file d'attente d'origine afin qu'une autre tentative puisse être effectuée. Cependant, cela peut se produire plus d'une fois si cet événement externe n'a toujours pas eu lieu, et dans le cas où cela n'arrive jamais, je veux limiter le nombre d'allers-retours que le message prend. Cela signifie que le DelayMessage a une propriété MaxRetries, mais cela est perdu lorsque le service de délai met en file d'attente le message d'origine pour la nouvelle tentative.Traitement des messages retardés NServiceBus

Quelles sont les autres options qui me manquent? Je suis heureux d'accepter qu'il existe une solution totalement différente à ce problème.

Répondre

4

Envisagez d'implémenter un saga qui stocke ce premier message, en le maintenant jusqu'à l'arrivée du second message. Vous pourriez aussi vouloir que la saga ouvre un timeout afin que votre processus n'attend pas indéfiniment si ce deuxième message a été perdu ou quelque chose. Wow l'homme lui-même - merci!

+0

Je ne peux pas vraiment utiliser une saga que je ne pense pas. Il n'y a qu'un seul message, et il a besoin de données dans la base de données avant de pouvoir être traité. Il n'y a pas réellement deux messages que je peux assembler dans une saga, les données sont créées par une procédure stockée héritée, j'utilise NSB pour ajouter des données supplémentaires qui le référence. –

+0

Ensuite, utilisez le timeout dans la saga pour vérifier s'il y avait des données dans la base de données - cela vous fournira un mécanisme d'interrogation simple; pas de données, demandez un autre délai. –

Questions connexes