2010-10-26 13 views
3

Autre question sur le thread Using NServiceBus with Asp.Net MVC 2. Udi a répondu en disant que la méthode suivante peut être utilisée si nous voulons vraiment le faire.Utilisation de NServiceBus dans une application Web

var sync = Bus.Send<SomeMessage>(/*data*/) 
      .Register((AsyncCallback)delegate(IAsyncResult ar) 
          { 
           var result = ar.AsyncState as CompletionResult; 
           // do something with result.Messages 
          }, 
          null 
      ); 

      sync.AsyncWaitHandle.WaitOne(/*timeout*/); 

Cela fonctionnera parfaitement dans une application Windows, car il n'y a qu'un seul utilisateur.

Je me demande comment cela fonctionnera dans une application Web; comme il existe plusieurs threads (pour plusieurs sessions utilisateur), appelez Bus.Send et attendez le rappel. Il n'y aura qu'une seule file d'attente de réponse (si ma compréhension est correcte). Est-ce que NServiceBus sait quel thread à reprendre en fonction du message de réponse qu'il a reçu de la file d'attente?

Si je comprends bien, il est recommandé de ne pas utiliser la messagerie pour ce genre de scénarios (envoyer un message de demande à partir d'une application Web à un service qui gère le message et la réponse avec un message de réponse)

" Par exemple, si vous souhaitez effectuer des requêtes telles que GetCustomersByRegionRequest et CustomersByRegionResponse, cela ne doit pas être implémenté à l'aide de la messagerie. " - http://docs.particular.net/

Répondre

1

En interne, NSB conserve tout cela en conservant un dictionnaire des rappels et des messages associés. Les messages ont un identifiant de corrélation utilisé pour effectuer la recherche. Vous avez raison, l'utilisation d'un message dans un scénario de demande/réponse va à l'encontre du but de la messagerie. Le but principal est de ne pas bloquer, dans lequel Request/Response est intrinsèquement un pattern de blocage. Voir la réponse d'Andreas dans le post ci-dessus, il a une bonne explication.