2010-04-03 92 views
3

我贴过这个问题前面 post ?使用MSMQ和WCF

开始于WCF和MSMQ读了。

我的第一个问题是 - 比如我在队列中有100条消息,我将如何让我的服务异步开始处理每条消息,以便它在同一时间处理多条消息。这甚至可能或者它总是一个同步操作?

更新: 比方说,我的系统是这样的,我有远程位置/服务器上传文件。我所有的处理都发生在一个中心位置。是否会利用msmq和wcf将来自远程位置的所有文件复制到中央位置。这些消息可以由监控数据库的应用程序提供,一旦它确定文件应该被复制,它会提供wcf服务收到的消息并将文件从远程复制到中央位置。

由于这是一个专用网络,该文件将通过unc路径访问。我知道我的客户会倾向于在某个时候做到这一点,并试图确定这是可行的给定的文件量和同时文件副本的要求。

我建议BITS,但由于IT部门的政治因素,客户对BITS感到不舒服。

回答

1

队列(顾名思义)包含一个线性队列的对象。你必须先取下一个,然后才能进入下一个。

可以创建receiveCompleted事件处理程序采取的对象从队列并将其传递到其他部件,用于处理

qq.ReceiveCompleted += new ReceiveCompletedEventHandler(qq_ReceiveCompleted); 
qq.BeginReceive(); 

static void qq_ReceiveCompleted(object sender, ReceiveCompletedEventArgs e) 
{ 
    //DO SOMETHING WITH e.Message.Body e.g. Start a seperate thread which processes the object. 

    // Listen for the next message. 
    queue.BeginReceive(); 
} 
3

的WCF服务器端代码将通过在配置服务限制设置来控制。默认情况下,对于每个请求(队列中的消息),将创建一个服务类的实例来处理消息。

服务器端WCF ServiceHost将为您处理此管理 - 无需在您身边进行特殊处理。

服务调节可以通过serviceThrottling行为进行控制。查看这个优秀的blog post by Dan Rigsby关于如何在配置中设置节流的细节。

<system.serviceModel> 
    <behaviors> 
     <serviceBehaviors> 
      <behavior name="throttled"> 
       <serviceThrottling 
        maxConcurrentCalls="16" 
        maxConcurrentInstances="2147483647" 
        maxConcurrentSessions="10"/> 
      </behavior> 
     </serviceBehaviors> 
    </behaviors> 
</system.serviceModel> 

最重要的设置将是maxConcurrentCalls - 这个定义多少并发呼叫会被你的WCF服务来处理。

您还应该查看此blog post here,其中显示了如何使用MSMQ + WCF以及与直接MSMQ和基于HTTP的WCF的对比。优秀的介绍,优秀的视频。