2

所以我正在发送移动应用推送通知,并且我已经设置了 Azure 通知中心,但我想在其中进行调度,我知道在 azure 中有一个选项可以做到这一点,因为它需要 200 美元决定创建 Azure Functions 来处理它,

我已经浏览了 NCRON 表达式,现在我想知道如何安排作业在特定日期运行一次,我能找到的只是基于重复的作业,并且是否可以像日期一样动态运行作业各不相同

 public static class Function1
{
    [FunctionName("Function1")]
    public static void Run([TimerTrigger("0 0 15 2 Jan")]TimerInfo myTimer, ILogger log)
    {
        log.LogInformation($"C# Timer trigger function executed at: {DateTime.Now}");
    }
}

我试图做这样的事情,在 1 月 2 日 15:00Hrs 运行一些东西,它似乎不起作用,我在这里遗漏了什么以及如何制作TimerTrigger动态任何输入将不胜感激

谢谢

4

4 回答 4

4

为了清楚地描述,我重新编辑了整个答案。希望这次我能解释清楚。

好的。首先,你需要知道,azure Function 有一个声明部分和一个配置部分。

在本地,声明部分是([TimerTrigger("* * * * * *")]TimerInfo myTimer, ILogger log),配置部分是local.settings.json文件。

部署到 Azure 时。它改变。声明部分变为function.json,而Application Settings成为配置部分。

根据您的要求,您可以在配置部分添加一个键并在您的函数中获取它。

例如,

在本地:

函数.cs:

using System;
using Microsoft.Azure.WebJobs;
using Microsoft.Azure.WebJobs.Host;
using Microsoft.Extensions.Logging;

namespace TimeTrigger
{
    public static class Function1
    {
        [FunctionName("Function1")]
        public static void Run([TimerTrigger("%Schedule%")]TimerInfo myTimer, ILogger log)
        {
            log.LogInformation($"C# Timer trigger function executed at: {DateTime.Now}");
        }
    }
}

local.settings.json:

{
  "IsEncrypted": false,
  "Values": {
    "AzureWebJobsStorage": "UseDevelopmentStorage=true",
    "FUNCTIONS_WORKER_RUNTIME": "dotnet",
    "Schedule": "* * * * * *"
  }
}

您可以通过更改json中key的值来更改timetrigger的触发方式。(例如,使用powershell修改值。或者您可以使用代码修改。)


在门户网站:

与本地类似,您可以在门户网站上执行此操作:

声明部分:

在此处输入图像描述

配置部分:

在此处输入图像描述

在此处输入图像描述

于 2020-01-03T01:28:37.823 回答
1

首先,您现在假设的主要问题是您的表达式,您可以参考文档的正确表达式格式:NCRONTAB 表达式

{second} {minute} {hour} {day} {month} {day-of-week}

然后关于您对动态运行作业的要求。您可以将计划表达式放在应用程序设置中,并将此属性设置为包含在 % 符号中的应用程序设置名称,如下例所示%ScheduleAppSetting%您可以在配置中检查它。

即使使用此表达式,它也会显示错误,但它仍然可以工作。

在此处输入图像描述

于 2020-01-03T06:29:01.220 回答
1

您可以使用以下链接生成详细的 CRON 表达式:

http://corntab.com/?c=0_15_2_1_ *

0 0 15 2 Jan *是生成的 CRON 表达式,它将在任何年份的每 1 月 2 日的 1500 小时运行它。

正如@Bowman 正确建议的那样,请检查并验证上面链接中的表达式,看看它是否有帮助。

于 2020-01-03T04:18:50.087 回答
0

如果您只需要运行一次计时器功能,为什么还要使用它?

我想说一个更好的解决方案是将消息发送到队列,以便使用属性 ScheduledEnqueueTimeUtc 在预定时间运行。

https://docs.microsoft.com/en-us/azure/service-bus-messaging/message-sequencing#scheduled-messages

于 2021-04-28T14:44:00.957 回答