MaxConcurrentCalls = 0,但在使用Azure Service Bus在本地工作时仍然具有工作线程

时间:2019-01-08 10:09:11

标签: c# multithreading azure

我设置了一个天蓝色的服务总线队列。在host.json文件中,我将maxConcurrentCalls设置为1,但是当我在本地调试应用程序时,正在运行8-10个工作线程,这使应用程序无法调试。在本地调试应用程序时,如何仅运行1个线程?

最初,我的host.json为空,我发现下面的代码应该只执行1个线程,请参见https://docs.microsoft.com/en-us/azure/azure-functions/functions-bindings-service-bus#host-json

{
  "version": "2.0",
  "extensions": {
      "serviceBus": {
          "prefetchCount": 100,
          "messageHandlerOptions": {
          "autoComplete": false,
          "maxConcurrentCalls": 1,
          "maxAutoRenewDuration": "00:55:00"
         }
       }
     }
 }

我将host.json设置添加到我的local.json设置中无济于事,我仍然有10个工作线程在启动时启动。 我也试图使函数调用单例 Make Azure Function run sequential on ServiceBusTrigger - maxConcurrentCalls not working 但是,这只是完全锁定了功能,根本没有解决任何问题。

   [FunctionName("ReadFromXCagoIssueQueueAndRetrieveFiles")]
    public static void Run([ServiceBusTrigger(QueueName, AccessRights.Manage, Connection = "SBConnection")]BrokeredMessage myQueueItem, TextWriter log)
    {
        log.WriteLine($"C# ServiceBus queue trigger function processed message: {myQueueItem}");
        var propIssueId = myQueueItem.Properties["IssueId"].ToString();
        var issueId = int.Parse(propIssueId);
        log.WriteLine($"begin grab files for issue: {issueId}");
        retrieveIssueEPub(issueId);
    }

retrieveIssueEPub的执行是在几个工作线程上执行的,这意味着该消息在函数运行1次后最终在死信队列中结束,因为该消息将同一条消息分配给所有线程,而不是我期望的1个线程最大并发调用数。我想念什么吗?一次同时提取1条消息和在多个线程上执行该函数之间有区别吗?

1 个答案:

答案 0 :(得分:0)

我的一位同事发现了错误。 该应用程序一次仅触发一个线程。但是,天蓝色本身的锁定持续时间设置为30秒。 这意味着该应用将在30秒等之后启动新线程,因为该消息已解锁。 扩展锁已解决了该问题。