【问题标题】:Azure Function timer configure through app settings通过应用设置配置 Azure Function 计时器
【发布时间】:2017-08-07 03:18:43
【问题描述】:

我正在处理 Azure 函数计时器作业,我需要从 appsettings 中获取 cron 表达式。请告诉我,我如何从 Azure 函数中的 appsettings 中获取值。我想从上午 9:00 到下午 12:00 每 30 分钟运行一次 azure 函数\

{
 "disabled": false,
 "bindings": [
   {
     "name": "timerInfo",
     "type": "timerTrigger",
     "direction": "in",
     "schedule": "0 * * * * *"
   }
 ]
}

【问题讨论】:

标签: c# azure azure-functions serverless


【解决方案1】:

将您的日程设置为"schedule": "%EmailScheduleTriggerTime%",然后在appsetting.json 或local.settings.json 中您可以将EmailScheduleTriggerTime 值设置为"0 30 9-12 * * *"

{
  "IsEncrypted": false,
  "Values": {
    "EmailScheduleTriggerTime": "0 30 9-12 * * *", //Run every  30 minutes from 9:00 to 12:00

  },
  "ConnectionStrings": {
    "DefaultConnection": ""
  }
}

[FunctionName("TimerfunctionApp")] 
public static void Run([TimerTrigger("%EmailScheduleTriggerTime%")] TimerInfo TInfo, TraceWriter log)

【讨论】:

  • 你能指点我的官方文档吗?在那里找不到这个
  • 我的意思是你在文档中哪里找到说 %variable% 将被环境变量 'variable' 替换
  • 有人让它在本地工作吗?当我在 local.settings.json 中指定设置时,出现错误:Microsoft.Azure.WebJobs.Host: Error indexing method 'MainTriggerEntry'. Microsoft.Azure.WebJobs.Host: '%CRON_EXPRESSION%' does not resolve to a value.
【解决方案2】:

如果您使用 VS2017 Functions 工具并在 .NET 项目中定义您的函数(而不是直接在 Azure 门户中),您可以使用 % 语法从 AppSettings 中获取间隔:

[FunctionName("MyTimerFunction")] 
public static void Run([TimerTrigger("%TimerInterval%")] TimerInfo myTimer, TraceWriter log, ..

然后在您的应用设置中指定所需的 CRON 格式间隔,例如。在local.settings.json

{
  "Values" : { 
      "TimerInterval" : "0 30 9-12 * * *"
    }
}

【讨论】:

  • 为什么投反对票?如果有一些反馈,很高兴改进这个答案。
  • 你的只是​​部分答案使用 0 30 9-12 * * *,我已编辑并发送评论。
  • 是否可以在函数内部使用类似这样的其他设置?我的意思是把参数名称放在 %'s 中?我无法让它工作。只有 TimerTrigger 可以这样使用设置吗?
  • 解决方法是在 Azure Portal 的 Azure Function 的 Application settings 中设置“TimerInterval”值,但我希望在部署期间可以配置此值。
【解决方案3】:

要添加到前面的答案,您可以使用 % 语法从配置文件 (appsettings.json) 文件中的任何字段中获取任何值 - 不仅来自 Values 配置对象。

例如:

appsettings.json:

{      
  "ScheduleConfiguration": {
    "FunctionOne": {
      "CronExpression": "0 40 2 * * *"
    }
  }
}

Functions.cs:

    /// <summary>
    /// %ScheduleConfiguration:FunctionOne:CronExpression%
    ///  - e.g. "0 40 2 * * *" - executes at 02:40:00am every day
    /// </summary>
    [FunctionName("FunctionOne")]
    public async Task FunctionOne(
        [TimerTrigger("%ScheduleConfiguration:FunctionOne:CronExpression%")]
        TimerInfo timerInfo)
    {
        // Azure function code
    }

【讨论】:

【解决方案4】:

由于这篇文章已经有了很好的答案,我想在这里分享我的经验。我试图通过在 appsettings.json 文件中添加 cron 表达式在本地运行应用程序,但是当我运行函数应用程序时,我总是收到如下错误

“EmployeeTimerTrigger”函数出错: Microsoft.Azure.WebJobs.Host:索引方法错误 '员工定时器触发器'。 Microsoft.Azure.WebJobs.Host: '%EmployeeTimerTrigger%' 无法解析为值。

因此,为了解决这个问题,我们需要将 cron 表达式从 appsettings.json 转换为 local.settings.json,它工作得很好,我能够在本地对其进行测试。

编辑:为部署添加注释

函数应用从azure上函数应用本身的应用程序设置中读取定时器触发设置。

当你计划在 Azure 中部署你的函数应用时,你需要在 Azure 门户中函数应用的应用程序设置中进行一些小的更改。

您可以通过在 azure 门户中选择函数应用来导航到这些设置 -> 配置 -> 应用程序设置

您需要添加的第一个设置是您希望计时器触发器运行的时区,这是一个相同的示例

注意:请注意这些值区分大小写

现在我们将在此处添加的第二个设置是用于我们的定时器触发功能,在这张图片中,您将看到定时器将在东部标准时间上午 10:00 和下午 2:00 运行。

您为什么要问东部标准时间?好吧,请记住,我们的第一个设置是针对网站时区的,因此这两个设置可以协同工作。

注意:计时器触发器的名称应与您的函数应用中的名称匹配,请注意这些值区分大小写,并且应与您的计时器触发器函数中的名称完全匹配。

添加这些设置后,不要忘记保存更改,现在您已准备好部署函数应用。

我希望这个答案有助于在本地部署和运行计时器功能。

【讨论】:

  • 您建议的更改意味着该值未在生产中使用(如果我的有限理解是正确的)
  • 您好@TimAbell 我已将部署步骤添加到我的答案中,请查看相同内容并告诉我是否有帮助。如果这有帮助,请点赞:)
  • 是的,我会说这澄清了一些事情,谢谢
【解决方案5】:

如前所述(对于 Node js),我们可以在 function.json 中使用 %scheduleValue% 并在 local.settings.json 中使用 scheduleValue 作为参数 在这里它在微软文档中提到 - https://docs.microsoft.com/en-us/azure/azure-functions/functions-bindings-timer?tabs=javascript#configuration

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-10-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-06
    相关资源
    最近更新 更多