Мне нужно подготовить комнаты для групп SharePoint Online, используя лазурные очереди и веб-задания. Я создал консольное приложение и опубликовал его как непрерывное веб-задание со следующими настройками:
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 я десериализую полученное 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.");
}
Есть ли способ запустить свою функцию обработки для параллельных сообщений, чтобы обеспечить работу моих сайтов без вмешательства?
Пожалуйста, дайте мне знать, если вам нужны более подробные сведения.
Заранее спасибо!