1

푸른 대기열 및 웹 작업을 사용하여 SharePoint Online 팀 회의실을 구축해야합니다. 나는 콘솔 응용 프로그램을 만들어 다음과 같은 설정으로 연속 웹 작업으로 게시 한 :Azure 웹 작업 - 대기열의 병렬 메시지 처리가 제대로 작동하지 않습니다.

트리거 기능은 다음과 같습니다
  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); 
    } 
내가받은 JSON 메시지를 deserialising있어

내부 ProcessQueueMsg 기능 클래스에서 다음 작업을 실행하십시오.

  • 기존 사이트 모음에 하위 사이트를 만들고 있습니다.
  • Pnp 프로비저닝 엔진을 사용하여 하위 사이트 (목록, 업로드 파일, 사용 권한, 빠른 점심 등)에 콘텐츠를 제공하고 있습니다.

대기열에 처리 할 메시지가 하나뿐이면 모든 것이 올바르게 수행됩니다.

그러나 처음 메시지가 처리되는 동안 지연 시간이 2 초인 큐에 두 개의 메시지를 보내면 다음 메시지가 클래스 속성을 덮어 쓰고 첫 번째 메시지가 완료됩니다.

별도의 스레드에서 각 메시지를 실행하려고했으나 트리거 기능이 내 기능 내에서 메시지 처리 전에 성공한 것으로 표시됩니다.이 방법으로 잠재적 예외/메시지 대기 행렬을 제어 할 수 없습니다.

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(); 
관련 문제