如何创建自定时触发功能?

时间:2019-03-21 03:44:23

标签: c# .net asp.net-core time azure-functions

寻找一些自给定时间开始的自触发功能。

例如用户召开会议将于25/04/2019 05:30开始 在这里用户应该在25/04/2019 05:25收到通知| 05:29会议即将开始。

创建了一个天蓝色功能(触发时间),该功能每分钟触发一次,并检查当前时间是否为会议时间-4分钟,然后发送有关要开始会议的通知。

将来会有多个用户,所以我不希望该功能每分钟运行一次,有没有办法在05:25或会议时间自动执行该功能。 因此,可以有100个用户,他们会有不同的用户。只是寻找有关如何以更好的方式实施的选择。

.net核心站点, 托管在天蓝色, 每隔一分钟运行一次天蓝色函数,以检查剩余部分

3 个答案:

答案 0 :(得分:4)

用户在会议上注册后,您可以将消息(带有用户详细信息)排队,以可见性延迟

queue.AddMessage(message, initialVisibilityDelay: TimeSpanDelay);

例如,用户在下午6点注册,而会议将在第二天晚上8点举行,因此延迟时间将分别为25小时55分钟(假设该用户希望在会议开始前5分钟收到通知)。然后,您将使用队列触发功能,而不是时间触发功能,当队列消息可见时,该功能将发送通知:

public static void Run([QueueTrigger("notifications")]QueueTrigger message, TraceWriter log)
{
    Notifier.Send(message.UserName, message.UserPhoneNumber, message.Email);
}

此外,如果由于某种原因您的通知处理程序将失败,队列消息也不会丢失,因此您可以尝试多次处理它们。

答案 1 :(得分:0)

我建议您使用石英库编写Windows服务来安排作业。您可以从db或其他地方获取作业计划时间。

引用:https://www.quartz-scheduler.net

答案 2 :(得分:-1)

根据您的描述,您已经有一个TimerTrigger函数,但是您的Timer设置该函数每分钟运行一次。实际上,您可以使用CRON表达式设置更精确的Timer触发器。

这是Azure Function中的CRON表达式,它包含六个字段:{second} {minute} {hour} {day} {month} {day-of-week}。因此,您可以设置功能0 25,29 5 22 March *

将功能部署到Azure之后,它将继续运行,但是直到触发Timer时,它才会执行Run方法。

public static void Run(TimerInfo myTimer, ILogger log)
{
    log.LogInformation($"C# Timer trigger function executed at: {DateTime.Now}");
}

enter image description here

enter image description here