使用msmq和wcf

时间:2010-04-03 13:54:41

标签: c# wcf msmq

我之前发过这个问题 post ?

开始阅读wcf和msmq。

我的第一个问题是 - 假设队列中有100条消息,我如何告诉我的服务异步开始处理每条消息,以便它同时处理多条消息。这甚至是可能还是总是同步操作?

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

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

我建议BITS,但由于政治部门的IT部门,客户对BITS不满意。

2 个答案:

答案 0 :(得分:3)

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

服务器端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和WCF-over-HTTP的对比方式。优秀的介绍,优秀的视频。

答案 1 :(得分: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();
}