即使锁未过期,也会在代理邮件上获取MessageLockLost异常

时间:2018-05-07 12:44:46

标签: azure azure-functions azureservicebus azure-servicebus-queues

我已经实现了服务总线触发器,我的示例代码如下所示。

   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分钟。 即使锁实际上没有过期,我也会收到少量请求的消息锁丢失异常。 请求流程时间如下:

  1. 服务总线触发器于:May 07 07:02:14 +00:00 2018 utc
  2. Broedred消息中的LockedUntilUtc:May 07 07:07:08.0149905 utc
  3. 消息锁定丢失异常发生在:May 07 07:02:18 +00:00 2018 utc
  4. 任何人都可以帮我找到我的代码实际上有什么问题。 感谢。

1 个答案:

答案 0 :(得分:3)

您不应在代码中明确调用CompleteAsyncAbandonAsync。 Azure Functions运行时将根据函数执行结果自动调用这些方法(如果没有发生异常,则Complete,否则为Abandon。)

手动更新锁也不是必需的,运行时应该为您管理。如果您正在使用消耗计划,则无论如何,函数执行的最长持续时间为5分钟(默认情况下)。

尝试删除所有管道代码并仅保留//Process message logic,看看是否有帮助。