首页 > 解决方案 > 天蓝色函数上的 TaskCanceledException(服务总线触发器)

问题描述

我有一个服务总线触发器 Azure 功能,每次主题收到消息时都会触发该功能。消息定期到达,例如每 30 分钟一次。批次之间,没有活动。

该函数没有什么特别的,它通过 HttpClient 异步发布消息。该函数会定期以 TaskCanceledException 停止。

HttpClient 是静态的

public static class SampleEventTrigger
{
    private static DefaultHttpWebHook webHook = new DefaultHttpWebHook(new Uri("https://nonexistent.invalid/sampleWebHook"), "/event/sampleEvent");

    [FunctionName("SampleEventTrigger")]
    public static async Task Run(
        [ServiceBusTrigger("sampleevent", "SampleEvent.Subs", AccessRights.Manage, Connection = GlobalConfiguration.ServiceBusConnection)]BrokeredMessage message,
        TraceWriter log)
    {
        log.Info("launch sample event subscription");

        try
        {
            var resp = await webHook.Post(message, log);
            log.Info($"{resp.StatusCode}, {resp.ReasonPhrase}");                
        }
        catch (Exception ex)
        {
            log.Error($"exception in webhook: {ex.Message}", ex);
            throw;
        }
    }
}

如果我稍后再举起它,这一次它就过去了。这个异常从何而来?我们如何避免这种情况?它与超时有关,还是与启动太慢的功能有关?

我的功能处于消费模式。

标签: azureazure-functionsazureservicebus

解决方案


您的 Http 调用可能会超时。等待的 Http 调用超时抛出 TaskCanceledException 。我不确定你的 DefaultHttpWebHook 类在幕后做了什么,但它应该在方法中使用PostAsyncPost它本身应该有 Async 后缀)。

要验证您是否可以捕获 TaskCanceledException 并检查内部异常。如果您仍在苦苦挣扎,请在本地开发期间将您的代码转换为非异步代码,以便更好地处理正在发生的事情 - 它会给您一个真正的异常,而不是将其作为 TCE 冒泡。


推荐阅读