首页 > 解决方案 > 带有 ServiceBus 的 Azure Functions:操作已取消

问题描述

我刚刚为我的 Azure Functions 部署了更新:定时器或服务总线触发器有不同的功能。最近几天我注意到一个与 ServiceBus 相关的错误

Microsoft.Azure.ServiceBus.ServiceBusCommunicationException - 操作已取消。

在此处输入图像描述

我不知道当函数收到消息或有其他事情时是否会发生这种情况。

该函数定义为

[FunctionName("createInvoiceListFromServiceBus")]
public async Task Run(
        [ServiceBusTrigger("invoice.requests.bulk", "requests", Connection = "AccountingServiceBusConnection")] 
        string myQueueItem,
        [ServiceBus("invoice.pdf.requests", Connection = "AccountingServiceBusConnection")] 
        IAsyncCollector<dynamic> pdfServiceBusRequests,
        [ServiceBus("invoice.paid.requests", Connection = "AccountingServiceBusConnection")] 
        IAsyncCollector<dynamic> paidServiceBusRequests)
    {
    }

这是我正在使用的包

<PackageReference Include="AzureExtensions.Swashbuckle" Version="3.2.2" />
<PackageReference Include="Microsoft.Azure.Functions.Extensions" Version="1.0.0" />
<PackageReference Include="Microsoft.Azure.KeyVault.Core" Version="3.0.5" />
<PackageReference Include="Microsoft.Azure.Storage.Blob" Version="11.1.7" />
<PackageReference Include="Microsoft.Azure.WebJobs.Extensions.ServiceBus" Version="4.1.2" />
<PackageReference Include="Microsoft.EntityFrameworkCore" Version="3.1.4" />
<PackageReference Include="Microsoft.Extensions.Configuration.AzureKeyVault" Version="3.1.5" />
<PackageReference Include="Microsoft.NET.Sdk.Functions" Version="3.0.7" />
<PackageReference Include="Xero.Api.SDK.Core" Version="1.1.4" />

这里是完整的错误描述。

[
   {
      "parsedStack":[
         {
            "assembly":"Microsoft.Azure.ServiceBus, Version=4.1.1.0, Culture=neutral, PublicKeyToken=7e34167dcc6d6d8c",
            "method":"Microsoft.Azure.ServiceBus.Core.MessageReceiver+<OnReceiveAsync>d__86.MoveNext",
            "level":0,
            "line":0
         },
         {
            "assembly":"System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=7cec85d7bea7798e",
            "method":"System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw",
            "level":1,
            "line":0
         },
         {
            "assembly":"System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=7cec85d7bea7798e",
            "method":"System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess",
            "level":2,
            "line":0
         },
         {
            "assembly":"System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=7cec85d7bea7798e",
            "method":"System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification",
            "level":3,
            "line":0
         },
         {
            "assembly":"Microsoft.Azure.ServiceBus, Version=4.1.1.0, Culture=neutral, PublicKeyToken=7e34167dcc6d6d8c",
            "method":"Microsoft.Azure.ServiceBus.Core.MessageReceiver+<>c__DisplayClass64_0+<<ReceiveAsync>b__0>d.MoveNext",
            "level":4,
            "line":0
         },
         {
            "assembly":"System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=7cec85d7bea7798e",
            "method":"System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw",
            "level":5,
            "line":0
         },
         {
            "assembly":"System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=7cec85d7bea7798e",
            "method":"System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess",
            "level":6,
            "line":0
         },
         {
            "assembly":"Microsoft.Azure.ServiceBus, Version=4.1.1.0, Culture=neutral, PublicKeyToken=7e34167dcc6d6d8c",
            "method":"Microsoft.Azure.ServiceBus.RetryPolicy+<RunOperation>d__19.MoveNext",
            "level":7,
            "line":0
         },
         {
            "assembly":"System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=7cec85d7bea7798e",
            "method":"System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw",
            "level":8,
            "line":0
         },
         {
            "assembly":"Microsoft.Azure.ServiceBus, Version=4.1.1.0, Culture=neutral, PublicKeyToken=7e34167dcc6d6d8c",
            "method":"Microsoft.Azure.ServiceBus.RetryPolicy+<RunOperation>d__19.MoveNext",
            "level":9,
            "line":0
         },
         {
            "assembly":"System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=7cec85d7bea7798e",
            "method":"System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw",
            "level":10,
            "line":0
         },
         {
            "assembly":"System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=7cec85d7bea7798e",
            "method":"System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess",
            "level":11,
            "line":0
         },
         {
            "assembly":"System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=7cec85d7bea7798e",
            "method":"System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification",
            "level":12,
            "line":0
         },
         {
            "assembly":"Microsoft.Azure.ServiceBus, Version=4.1.1.0, Culture=neutral, PublicKeyToken=7e34167dcc6d6d8c",
            "method":"Microsoft.Azure.ServiceBus.Core.MessageReceiver+<ReceiveAsync>d__64.MoveNext",
            "level":13,
            "line":0
         },
         {
            "assembly":"System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=7cec85d7bea7798e",
            "method":"System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw",
            "level":14,
            "line":0
         },
         {
            "assembly":"System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=7cec85d7bea7798e",
            "method":"System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess",
            "level":15,
            "line":0
         },
         {
            "assembly":"System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=7cec85d7bea7798e",
            "method":"System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification",
            "level":16,
            "line":0
         },
         {
            "assembly":"Microsoft.Azure.ServiceBus, Version=4.1.1.0, Culture=neutral, PublicKeyToken=7e34167dcc6d6d8c",
            "method":"Microsoft.Azure.ServiceBus.Core.MessageReceiver+<ReceiveAsync>d__62.MoveNext",
            "level":17,
            "line":0
         },
         {
            "assembly":"System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=7cec85d7bea7798e",
            "method":"System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw",
            "level":18,
            "line":0
         },
         {
            "assembly":"System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=7cec85d7bea7798e",
            "method":"System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess",
            "level":19,
            "line":0
         },
         {
            "assembly":"System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=7cec85d7bea7798e",
            "method":"System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification",
            "level":20,
            "line":0
         },
         {
            "assembly":"Microsoft.Azure.ServiceBus, Version=4.1.1.0, Culture=neutral, PublicKeyToken=7e34167dcc6d6d8c",
            "method":"Microsoft.Azure.ServiceBus.MessageReceivePump+<<MessagePumpTaskAsync>b__11_0>d.MoveNext",
            "level":21,
            "line":0
         }
      ],
      "severityLevel":"Information",
      "outerId":"0",
      "message":"The operation was canceled.",
      "type":"Microsoft.Azure.ServiceBus.ServiceBusCommunicationException",
      "id":"65258033"
   },
   {
      "parsedStack":[
         {
            "assembly":"System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=7cec85d7bea7798e",
            "method":"System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw",
            "level":0,
            "line":0
         },
         {
            "assembly":"Microsoft.Azure.Amqp, Version=2.4.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35",
            "method":"Microsoft.Azure.Amqp.AsyncResult.End",
            "level":1,
            "line":0
         },
         {
            "assembly":"Microsoft.Azure.Amqp, Version=2.4.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35",
            "method":"Microsoft.Azure.Amqp.ReceivingAmqpLink.EndReceiveMessages",
            "level":2,
            "line":0
         },
         {
            "assembly":"Microsoft.Azure.ServiceBus, Version=4.1.1.0, Culture=neutral, PublicKeyToken=7e34167dcc6d6d8c",
            "method":"Microsoft.Azure.ServiceBus.Core.MessageReceiver+<>c__DisplayClass86_0.<OnReceiveAsync>b__1",
            "level":3,
            "line":0
         },
         {
            "assembly":"System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=7cec85d7bea7798e",
            "method":"System.Threading.Tasks.TaskFactory`1.FromAsyncCoreLogic",
            "level":4,
            "line":0
         },
         {
            "assembly":"System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=7cec85d7bea7798e",
            "method":"System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw",
            "level":5,
            "line":0
         },
         {
            "assembly":"System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=7cec85d7bea7798e",
            "method":"System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess",
            "level":6,
            "line":0
         },
         {
            "assembly":"System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=7cec85d7bea7798e",
            "method":"System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification",
            "level":7,
            "line":0
         },
         {
            "assembly":"Microsoft.Azure.ServiceBus, Version=4.1.1.0, Culture=neutral, PublicKeyToken=7e34167dcc6d6d8c",
            "method":"Microsoft.Azure.ServiceBus.Core.MessageReceiver+<OnReceiveAsync>d__86.MoveNext",
            "level":8,
            "line":0
         }
      ],
      "severityLevel":"Information",
      "outerId":"65258033",
      "message":"The operation was canceled.",
      "type":"System.OperationCanceledException",
      "id":"65736993"
   }
]

标签: azureazure-functions

解决方案


错误是暂时的吗?然后,很可能是您的应用程序与其依赖项之一之间存在某种连接问题。错误The operation was canceled表示异步任务已取消,或者很可能已超时
https://www.asptricks.net/2019/10/task-cancellationtoken-net-c-example.html

对于超时搜索...查看pasredStack看起来超时的代码正在使用Microsoft.Azure.ServiceBus.Core.MessageReceiver. 从您的主要主要run()方法中,可以安全地推断出使用 的两个操作之一AccountingServiceBusConnection可能已超时。

为了重现错误,我建议在同时负载测试这些底层资源的同时尝试此操作:pdfServiceBusRequestspaidServiceBusRequests

或者,您可以延长一些隐式超时期限。想想那些服务。有什么可以超时的吗?我们使用的是 http 客户端还是 sql 客户端?这些客户端往往具有可以在代码中覆盖的隐式默认超时。我建议寻找对任何客户端进行 web 或 db 调用的任何引用,并搜索将它们的超时时间延长到最大以缓解问题。另一种选择可能是试图System.OperationCanceledException优雅地捕捉和处理这些。


推荐阅读