azure - 天蓝色函数上的 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;
}
}
}
如果我稍后再举起它,这一次它就过去了。这个异常从何而来?我们如何避免这种情况?它与超时有关,还是与启动太慢的功能有关?
我的功能处于消费模式。
解决方案
您的 Http 调用可能会超时。等待的 Http 调用超时抛出 TaskCanceledException 。我不确定你的 DefaultHttpWebHook 类在幕后做了什么,但它应该在方法中使用PostAsyncPost
(它本身应该有 Async 后缀)。
要验证您是否可以捕获 TaskCanceledException 并检查内部异常。如果您仍在苦苦挣扎,请在本地开发期间将您的代码转换为非异步代码,以便更好地处理正在发生的事情 - 它会给您一个真正的异常,而不是将其作为 TCE 冒泡。
推荐阅读
- java - 类 Random Java:对于 Random 类型,方法“roll()”未定义。为什么?
- apache-spark - 执行程序完成状态为 KILLED exitStatus 1
- node.js - 如何将项目的 id 从子组件传递给父组件?
- c++ - 无法在 Windows 上编译 boost::asio 示例
- c - 广度优先搜索问题
- sql - 如果使用 SQL 的内部连接找到 null,如何将默认值传递给选定的列名
- c# - 在一个 XML 文件中保存并加载两次 DataTable 并加载它
- spring-boot - 即使使用 Etag、max-age: 0、must-revalidate 和 no-cache,更改后的静态文件的 URL 仍然返回 304
- c - 为什么这个 printf 语句需要一个 & 符号?
- php - Symfony 3 - 如果帐户在 FOSUserBundle 中被禁用,则继续会话