我之前发过这个问题 post ?
开始阅读wcf和msmq。
我的第一个问题是 - 假设队列中有100条消息,我如何告诉我的服务异步开始处理每条消息,以便它同时处理多条消息。这甚至是可能还是总是同步操作?
更新: 假设我的系统是这样的,我有远程位置/服务器也可以上传文件。我所有的处理都发生在一个中心位置。将使用msmq和wcf,其中来自远程位置的所有文件都被复制到中心位置。消息可以由监视数据库的应用程序提供,一旦确定应该复制文件,它就会提供wcf服务接收的消息,并将文件从远程位置复制到中心位置。
由于这是一个专用网络,因此可以通过unc路径访问该文件。我知道我的客户会倾向于在某个时候这样做,并试图确定这是否可行,因为文件量和同时文件副本的要求。
我建议BITS,但由于政治部门的IT部门,客户对BITS不满意。
答案 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();
}