【问题标题】:Azure webjobs: send notification emails at scheduled time?Azure webjobs:在预定时间发送通知电子邮件?
【发布时间】:2019-01-08 05:03:57
【问题描述】:

我需要一些关于如何使用 azure webjobs 来满足此要求的反馈。

我有一个要求,我们需要在预定时间发送通知电子邮件。通知的频率存储在数据库表中。表条目示例:

webjob 应该从 DB 表中读取配置并在配置的时间发送通知电子邮件(配置的时间是 DB 条目中提到的时间)。 DB 表中将有多个条目,并且可以添加或修改新条目。上面的例子只有 2 个条目,可以有更多。

问题:

  1. 从 DB 读取配置后,如何让 webjob 在一天中的特定时间触发电子邮件?
  2. 是否有更好的方法来使用任何其他 azure 资源来实施此通知计划?
  3. 如何确保webjob成功发送邮件?
  4. 如果 webjob 发送邮件失败,是否有重试机制?

任何帮助将不胜感激。

提前致谢。

【问题讨论】:

  • 您可以使用 webjob、azure 函数、逻辑应用程序来执行调度程序工作,但您需要将您的时间转换为 cron 表达式或数据格式。您还可以选择在表中添加一个名为“cron”的列。
  • 另一种选择是每分钟触发一次网络作业/功能并检查是否有任何邮件要发送。
  • @GeorgeChen:在这种情况下,网络作业应该是连续的还是触发的?
  • @user2439903 因为您应该持续监控表格,所以我认为您可以将其设置为连续,然后添加计时器触发器。
  • @George Chen:如果在表格中创建“cron”作为列是一种解决方案,我们将如何设置 webjob 的时间?你有例子吗。抱歉,我问的是如何以编程方式完成。我是使用网络作业的新手。

标签: azure azure-webjobs azure-webjobssdk azure-webjobs-continuous


【解决方案1】:

如果您想从表中选择“cron”数据然后创建计时器触发器,您可以使用表达式绑定。从官方doc我们可以知道我们可以从应用设置中获取绑定,您可以这样做或参考以下代码。

 public class Program
{
  public static void Main()
   {
    JobHostConfiguration config = new JobHostConfiguration();
    config.NameResolver = new TimeResolver();
    config.UseTimers();
    JobHost host = new JobHost(config);
    host.RunAndBlock();
}

private class TimeResolver : INameResolver
{
    public string Resolve(string name)
    {
        string value = string.Empty;
        switch (name)
        {
            case "TimerJob":
                Console.WriteLine("Name Is TimerJob : " + name);
                value = "00:00:10";
                break;
            case "TimerJobAlter":
                Console.WriteLine("Name Is TimerJobAlter : " + name);
                value = "00:00:20";
                break;
        }
        return value;
    }
}


//Runs once every 30 seconds
public static void TimerJob([TimerTrigger("%TimerJob%")] TimerInfo timer)
{
    Console.WriteLine("Timer1 job fired!");
}

// Runs once every 60 seconds
public static void TimerJobAlter([TimerTrigger("%TimerJobAlter%")] TimerInfo timer)
{
    Console.WriteLine("Timer2 job fired!");
}
}

您可以选择将值设置到配置文件中,然后从中读取。关于如何阅读,你可以看看这个doc

关于使用表格数据创建webjob的详细示例代码,抱歉我没有,希望这些代码可以帮助你。如果您还有其他问题,请告诉我。

【讨论】:

  • 非常感谢。此代码示例有帮助。您分享的示例展示了如何动态设置 cron 表达式以及如何从应用配置中读取值。当我在 db 表中有 100 多个配置或 cron 表达式并且我必须阅读条目并使用这 100 多个 cron 配置开始相同的工作时,你建议什么解决方案?如果数据库中的任何 cron 表达式得到更新,我还必须重新启动 webjob。另外,如何读取这个网络作业中的数据库并更新 cron 表达式?
  • 您可以使用 for 循环运行作业。您可以从 Web 作业访问 Azure SQL 数据库,如本答案所示。stackoverflow.com/questions/24941001/… 如果您将数据存储在 azure SQL 中,我认为您不需要重新启动它,您可以在数据库中更新它会读取它.
  • @user2439903 ,还有问题吗?如果它有帮助,您可以接受它作为答案。
  • @George Chen:我在想是否有一种方法可以读取具有 cron 的 sql DB 表列,获取所有 cron 表达式并使用所有这些 cron 表达式执行相同的 TimerTrigger 方法。我需要在不同的时间(在 cron 表达式中指定)执行相同的方法。我怎样才能做到这一点?我仍然无法实现它。如果我的问题不清楚,请告诉我。感谢您的跟进。
  • @user2439903,实际上我没有像你那样编写示例代码,所以这是我的想法。您获取所有 cron 数据并将它们作为列表润湿,然后循环执行该方法并替换 %TimerJob%。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多