我已经实现了服务总线触发器,我的示例代码如下所示。
public static async Task Run([ServiceBusTrigger("myqueue", Connection =
"myservicebus:cs")]BrokeredMessage myQueueItem, TraceWriter log)
{
try
{
if (myQueueItem.LockedUntilUtc <= DateTime.UtcNow)
{
log.Info($"Lock expired.");
return;
}
//renew lock if message lock is about to expire.
if ((myQueueItem.LockedUntilUtc - DateTime.UtcNow).TotalSeconds <= defaultLock)
{
await myQueueItem.RenewLockAsync();
return true;
}
//Process message logic
await myQueueItem.CompleteAsync();
}
catch (MessageLockLostException ex)
{
log.Error($"Message Lock lost. Exception: {ex}");
}
catch(CustomException ex)
{
//forcefully dead letter if custom exception occurs
await myQueueItem.DeadLetterAsync();
}
catch (Exception ex)
{
log.Error($"Error occurred while processing message. Exception: {ex}");
await myQueueItem.AbandonAsync();
}
}
我已将队列上的默认锁定持续时间设置为5分钟。 即使锁实际上没有过期,我也会收到少量请求的消息锁丢失异常。 请求流程时间如下:
任何人都可以帮我找到我的代码实际上有什么问题。 感谢。
答案 0 :(得分:3)
您不应在代码中明确调用CompleteAsync
和AbandonAsync
。 Azure Functions运行时将根据函数执行结果自动调用这些方法(如果没有发生异常,则Complete
,否则为Abandon
。)
手动更新锁也不是必需的,运行时应该为您管理。如果您正在使用消耗计划,则无论如何,函数执行的最长持续时间为5分钟(默认情况下)。
尝试删除所有管道代码并仅保留//Process message logic
,看看是否有帮助。