在Web应用程序中使用NServiceBus

问题描述:

关于Using NServiceBus with Asp.Net MVC 2线程的另一个问题。 Udi回复说,如果我们真的想要这样做,可以使用以下方法。在Web应用程序中使用NServiceBus

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*/); 

这将在Windows应用程序中完美工作,因为只有一个用户。

我想知道这将如何在Web应用程序中工作;因为有多个线程(用于多个用户会话)调用Bus.Send并等待回调。只有一个回复队列(如果我的理解是正确的)。

NServiceBus根据队列中收到的响应消息知道要恢复哪个线程?

如果我的理解是正确的,它是不推荐使用消息对这些类型的场景(从Web应用程序发送一个请求消息服务,其处理消息和一个响应消息回复)

“例如,如果您想执行像GetCustomersByRegionRequest和CustomersByRegionResponse这样的查询,那么不应该使用消息传递来实现。“ - http://docs.particular.net/

内部NSB通过维护回调及其相关消息的字典来保持这一切。这些消息具有用于执行查找的相关ID。您是正确的,在请求/响应方案中使用消息确实会破坏消息传递的目的。主要目的是不阻塞,其中请求/响应固有地是阻塞模式。在上面的帖子中看到Andreas的回应,它有很好的解释。