2011-06-21 2 views
3

Je veux créer une saga qui est démarrée par le message "Event1" mais qui ignorera la réception des messages de démarrage "dupliqués" avec le même identifiant applicatif (qui peut résulter du fait que deux utilisateurs ou plus touchent un bouton UI dans une courte période temps). La documentation semble suggérer que cette approche fonctionnerait:Comment empêcher le démarrage d'une saga NServiceBus plusieurs fois?

  • Saga déclare IAmStartedByMessages<Event1>
  • Saga se configure avec ConfigureMapping<Event1>(s => s.SomeID, m => m.SomeID);
  • poignée (Event1 EVT) définit un indicateur booléen lorsqu'il traite le premier message, et tombe du gestionnaire si le drapeau a déjà été défini.

Est-ce que cela fonctionnera? Aurai-je une condition de concurrence si les abonnés sont multithread? Si oui, comment puis-je atteindre le comportement souhaité?

Merci!

Répondre

4

La condition de concurrence se produit lorsque deux messages Event1 sont traités simultanément. La façon d'empêcher la création de deux instances saga consiste à définir une contrainte unique sur la colonne SomeID.

+0

Ok, merci. Et ai-je raison de supposer que l'échec résultant de la contrainte unique fera en sorte qu'il sera retenté, ce qui frapperait alors ma logique de garde avec les résultats attendus? – jlew

+0

C'est tout à fait vrai. –

Questions connexes