2014-01-24 90 views
1

我開發了工作角色應用程序來處理不同的任務。例如任務1,任務2有100條記錄,我已經將主題存儲在隊列中,並且我想要同時開始處理並跨越多個實例的負載。如何在azure工作角色中同時開始處理任務

將來會有更多的任務和記錄裏面的任務處理會增加。 那麼我該如何改進以下方法來有效地處理記錄?

目前,我已經做了代碼順序如下

private void ProcessTaskQueues() 
     { 

      var currentInterval1 = 0; 
      var maxInterval1 = 15; 
      var currentInterval2 = 0; 
      var maxInterval2 = 15; 
      string queueName1 = RoleEnvironment.GetConfigurationSettingValue("Task1Queue"); 
      CloudQueue queue1 = storageAccount.CreateCloudQueueClient().GetQueueReference(queueName1); 
      queue1.CreateIfNotExists(); 
      string queueName2 = RoleEnvironment.GetConfigurationSettingValue("Task2Queue"); 
      CloudQueue queue2 = storageAccount.CreateCloudQueueClient().GetQueueReference(queueName2); 
      queue2.CreateIfNotExists(); 

      while (true) 
      { 
       try 
       { 
        TaskPerformer tp = new TaskPerformer(); 
        // Task 1 
        Trace.WriteLine(string.Format("[{0}] - [TASK1] Fetch Message queue", DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss"))); 
        var cloudQueueMessage1 = queue1.GetMessage(); 
        if (cloudQueueMessage1 != null) 
        { 
         currentInterval1 = 0; 
         if (cloudQueueMessage1.DequeueCount <= 1) 
         { 
          var item = cloudQueueMessage1.FromMessage<Task1Item>(); 
          tp.ExecuteTask1(item); 
          Trace.WriteLine(string.Format("[{0}] - [TASK1] Message Executed for ID : {1}", DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss"), item.MLPID)); 
          queue2.DeleteMessage(cloudQueueMessage1); 
         } 
        } 
        else 
        { 
         if (currentInterval1 < maxInterval1) 
         { 
          currentInterval1++; 
          Trace.WriteLine(string.Format("[{0}] - Waiting for {1} seconds", DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss"), currentInterval1)); 
         } 
         Thread.Sleep(TimeSpan.FromSeconds(currentInterval1)); 
        } 

        // Task 2 
        Trace.WriteLine(string.Format("[{0}] - [TASK2] Fetch Message queue", DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss"))); 
        var cloudQueueMessage2 = queue2.GetMessage(); 
        if (cloudQueueMessage2 != null) 
        { 
         currentInterval2 = 0; 
         if (cloudQueueMessage2.DequeueCount <= 1) 
         { 

          var dns = cloudQueueMessage2.FromMessage<DNS>(); 
          tp.ExecuteTask2(dns); 
          Trace.WriteLine(string.Format("[{0}] - [TASK2] Message Executed for ID : {1}", DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss"), dns.ID)); 
          queue2.DeleteMessage(cloudQueueMessage2); 
         } 
        } 
        else 
        { 
         if (currentInterval2 < maxInterval2) 
         { 
          currentInterval2++; 
          Trace.WriteLine(string.Format("[{0}] - Waiting for {1} seconds", DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss"), currentInterval2)); 
         } 
         Thread.Sleep(TimeSpan.FromSeconds(currentInterval2)); 
        } 
       } 
       catch (Exception) 
       { } 
      } 
     } 
+0

是否有一個特別的原因,你使用不同的隊列爲每個任務類型?您可以將所有任務推送到一個隊列中,當您獲取消息時,可以從消息中找出任務類型並相應地處理任務。 –

+0

@GauravMantri基本上我有2種不同類型的輔助方法將二進制轉換爲二進制和隱藏的二進制,所以我如何映射隊列? 即 var item = cloudQueueMessage1.FromMessage (); var dns = cloudQueueMessage2.FromMessage () –

回答

相關問題