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

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

我需要使用 azure 队列和 Web 作业配置 SharePoint Online 团队 session 室。 我创建了一个控制台应用程序,并使用以下设置发布为连续 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.");
        }

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

如果您需要更多详细信息,请告诉我。

提前谢谢您!

最佳答案

您没有在构造时将配置对象传递给 JobHost - 这就是您的配置设置不起作用的原因。将代码更改为:

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

关于Azure Web 作业 - 来自队列的并行消息处理无法正常工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42839781/

相关文章:

ruby-on-rails - 如何使用 Azure Pipelines 将 Ruby 部署到 Azure 应用服务?

azure - webjobs 使用 IBinder 删除 blob

azure-webjobs - 如何从 C# 控制台应用写入 Azure WebJobs 中的日志?

azure - 如果我对 Azure Web 作业实现监控,会对 Azure 应用服务性能产生负面影响吗?

azure - Azure WebJobs 可以按需轮询队列吗?

azure-webjobssdk - 删除 SingletonAttribute 后无法在 Azure WebJob 中获取 Singleton 锁

c# - Azure Cosmos-db 重命名文档属性

Azure云远程调试器附加: error specified method is not supported

php - Python 到 PHP - Azure 机器学习

Azure Web 作业 - 同一 Web 作业中的多个函数和/或同一 Web 应用程序中的多个 Web 作业对性能有何影响?