Azure Web作业 - 队列中的并行消息处理无法正常工作

时间:2017-03-16 16:32:35

标签: azure azure-webjobs azure-webjobssdk azure-storage-queues

我需要使用azure队列和Web作业来配置SharePoint Online团队空间。 我创建了一个控制台应用程序,并使用以下设置发布为连续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函数内部,我在类中反序列化收到的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.");
        }

有没有办法可以为并行消息运行处理功能,以便在不干扰的情况下配置我的网站?

如果您需要更多详细信息,请与我们联系。

提前谢谢!

1 个答案:

答案 0 :(得分:3)

您没有在构造中将配置对象传递给JobHost - 这就是您的配置设置没有效果的原因。将您的代码更改为:

JobHost host = new JobHost(config);
host.RunAndBlock();