2011-09-03 2 views
2

Si j'ai une saga composée de deux types de messages, disons démarrés par message1 et complétés par message2, puis-je retourner un rappel si un message2 arrive sans qu'un message1 existe déjà? Je sais qu'il va le vider dans la file d'erreurs, mais je veux être capable de retourner un état au client expéditeur pour dire qu'il y a un état d'erreur dû au fait que le premier message n'est pas là.Dans NServiceBus, comment puis-je gérer lorsqu'un message arrive sans saga correspondante?

Répondre

3

Alors je me suis dehors, je avais juste besoin de mettre en œuvre IFindSagas pour le type de message:

public class MySagaFinder : IFindSagas<MySagaData>.Using<Message2> 
{ 
    public ISagaPersister Persister { get; set; } 
    public IBus Bus { get; set; } 

    public MySagaFinder FindBy(Message2 message) 
    { 
     var data = Persister.Get<MySagaData>("MessageIdProperty", message.MessageIdProperty); 
     if (data == null) 
     { 
      Bus.Return(0); 
     } 
     return data; 
    } 
} 

Je ne sais pas si cela est le droit façon de le faire, mais ça marche!

+0

Il n'y a jamais de manière définitive, cela dépend toujours. Et il n'y a pas beaucoup de détails dans la question, mais je suppose que vous êtes sur la mauvaise voie. Il y a de bonnes chances que le premier message ne soit pas encore traité. Simple parce que le deuxième message arrive en premier. C'est une messagerie asynchrone, ce qui signifie que les messages ne viennent pas toujours dans le même ordre. Jetez un oeil à ma réponse initiale. Ce que vous utilisez ici est la recherche de saga complexe, qui est destinée à quand saga est déjà démarré. Pas pour votre scénario. –

0

Si vous avez une saga qui peut recevoir deux messages, mais les messages peuvent être reçus dans n'importe quel ordre, assurez-vous que la saga peut être démarrée par les deux messages. Ensuite, vérifiez si les deux messages sont arrivés en définissant un état dans la saga elle-même. Si les deux messages sont arrivés, marquez-le comme complet. Le comportement par défaut de NServicebBus est d'ignorer tout message qui n'a pas de saga correspondante. C'est parce que vous pouvez définir un délai d'expiration, par exemple. Si rien ne se passe dans les 24 heures, la saga peut envoyer un message Timeout à lui-même. Mais si quelque chose s'est passé et que vous avez marqué votre saga comme terminée, que devrait-il arriver au message Timeout? Par conséquent, NServiceBus l'ignore.

Questions connexes