首页 > 解决方案 > Azure 计时器触发功能根本不执行脚本日志

问题描述

我正在使用测试模板测试计时器触发功能,并且无法执行脚本和任何日志作为“JavaScript 计时器触发功能运行!”。它以前对我有用,但是第二天它根本不执行脚本,函数本身似乎正在运行,但我无法测试脚本,也不明白问题出在哪里。我的 function.js 文件

{
  "bindings": [
    {
      "name": "myTimer",
      "type": "timerTrigger",
      "direction": "in",
      "schedule": "0 * * * * *",
      "runOnStartup": true
    }
  ]
}

local.settings.json

{
  "IsEncrypted": false,
  "Values": {
    "FUNCTIONS_WORKER_RUNTIME": "node",
    "AzureWebJobsStorage": "UseDevelopmentStorage=true",
    "githubKey": "sample123"
  },
  "Host": {
    "LocalHttpPort": 7071,
    "CORS": "*",
    "CORSCredentials": false
  }
}

这就是我在终端中所拥有的

在此处输入图像描述

index.js

 module.exports = async function (context, myTimer) {
    var timeStamp = new Date().toISOString();

    if (myTimer.IsPastDue)
    {
        context.log('JavaScript is running late!');
    }
    context.log('JavaScript timer trigger function ran!', timeStamp);   
};

标签: azure-functions

解决方案


我可以重现您的问题,然后我在 github 中发现了同样的问题:使用主机锁改进计时器触发行为

在此处输入图像描述

它是由 Singleton Lock 引起的,更多细节可以参考:Singleton Locks,在 Local Development 下它说:

ListenerLockPeriod 的默认值为 60 秒,这意味着如果主机被不正常地杀死(例如,在本地运行时关闭控制台窗口),在租约自然到期之前,无法重新获取所持有的 blob 租约。这意味着如果您杀死一个正在运行的实例然后尝试立即重新启动 JobHost,您将看到该函数不会立即开始运行,因为它正在等待获取 Singleton 锁。

假设这是你的问题的原因,所以在 github 问题中有一个解决方案listenerLockPeriod在 host.json 中设置。

这是一个示例:

"singleton": {
    "listenerLockPeriod": "00:00:15" 
  }

在此处输入图像描述


推荐阅读