2010-04-03 93 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的對比。優秀的介紹,優秀的視頻。