1

我需要配置使用Azure隊列和Web作業的SharePoint Online團隊客房。 我創建了一個控制檯應用程序,並公佈爲連續Web作業使用以下設置:Azure Web作業 - 來自隊列的並行消息處理無法正常工作

  config.Queues.BatchSize = 1; 

      config.Queues.MaxDequeueCount = 4; 

      config.Queues.MaxPollingInterval = TimeSpan.FromSeconds(15); 

      JobHost host = new JobHost(); 

      host.RunAndBlock(); 

觸發功能如下:

public static void TriggerFunction([QueueTrigger("messagequeue")]CloudQueueMessage message) 
    { 
     ProcessQueueMsg(message.AsString); 
    } 

內ProcessQueueMsg功能即時deserialising接收JSON消息在一個類中運行以下操作:

  • 我在現有網站集中創建子網站;
  • 使用Pnp供應引擎,我在供應內容的子 網站(列表,上傳文件,權限,快速午餐等)。

如果在隊列中我只有一條消息要處理,那麼一切正常。

但是,當我在延遲幾秒的隊列中發送兩條消息時,在處理第一條消息時,下一條消息覆蓋類屬性,並且第一條消息結束。

試圖在單獨的線程中運行每條消息,但觸發器函數在我的函數內部處理消息之前標記爲成功。這樣我就無法控制潛在的異常/消息出隊。

試圖也給線程數限制爲1和信號燈使用,但有相同的行爲:

private const int NrOfThreads = 1; 
private static readonly SemaphoreSlim semaphore_ = new SemaphoreSlim(NrOfThreads, NrOfThreads); 

//Inside TriggerFunction 

      try 
      { 
       semaphore_.Wait(); 

       new Thread(ThreadProc).Start(); 
      } 
      catch (Exception e) 
      { 
       Console.Error.WriteLine(e); 
      } 

public static void ThreadProc() 
     { 
      try 
      { 
       DoWork(); 
      } 
      catch (Exception e) 
      { 
       Console.Error.WriteLine(">>> Error: {0}", e); 
      } 
      finally 
      { 
       // release a slot for another thread 
       semaphore_.Release(); 
      } 
     } 

     public static void DoWork() 
     { 
      Console.WriteLine("This is a web job invocation: Process Id: {0}, Thread Id: {1}.", System.Diagnostics.Process.GetCurrentProcess().Id, Thread.CurrentThread.ManagedThreadId); 
      ProcessQueueMsg(); 
      Console.WriteLine(">> Thread Done. Processing next message."); 
     } 

有沒有一種方法可以讓我以運行並行的消息我的處理功能,提供我的網站沒有干擾?

如果您需要更多詳細信息,請讓我知道。

預先感謝您!

回答

3

你沒有將配置對象傳遞給JobHost的構造 - 這就是爲什麼你的配置設置沒有效果。將您的代碼更改爲:

JobHost host = new JobHost(config); 
host.RunAndBlock(); 
相關問題