在特定时间触发Webjobs

时间:2015-08-07 10:01:26

标签: c# azure azure-webjobs

我想在使用.NET将记录添加到数据库后24小时触发Azure Webjob。显然,Webjob将有多个任务在他们指定的时间处理。有没有办法(在Azure Library for .NET中)我可以安排这项任务?

我可以自由使用消息队列,但我想尝试避免对新消息进行不必要的WebJob轮询。

3 个答案:

答案 0 :(得分:3)

如果要在SQL数据库中插入记录24小时后触发WebJob的执行,我肯定会使用Azure队列。因此,在插入记录后,只需向队列添加一条消息。

为了做到这一点,您可以轻松利用可以传递给initialVisibilityDelay方法的CloudQueue.AddMessage()属性。这将使邮件在您的情况下24小时不可见,然后它将显示由您的Webjob处理。您不必安排任何事情,只需让连续WebJob监听正在运行的队列。

以下是一些示例代码:

public void AddMessage(T message, TimeSpan visibilityDelay)
{
    var serializedMessage = JsonConvert.SerializeObject(message);
    var queue = GetQueueReference(message);
    queue.AddMessage(new CloudQueueMessage(serializedMessage), null, visibilityDelay);
}

private static CloudQueue GetQueueReference(T message)
{
    var storageAccount = CloudStorageAccount.Parse("Insert connection string");
    var queueClient = storageAccount.CreateCloudQueueClient();
    var queueReference = queueClient.GetQueueReference("Insert Queue Name");

    queueReference.CreateIfNotExists();
    return queueReference;
}

希望这有帮助

答案 1 :(得分:1)

由于将记录添加到数据库的事件是此处的触发器,因此您可以使用Azure管理库创建Azure Scheduler作业,以便在插入db记录24小时后执行。 Azure Scheduler作业只能执行以下三项操作:发出HTTP / HTTPS请求或将消息放入队列中。由于您不想轮询队列,因此这里有两个选项

  1. 将现有Web作业部署为Wep API,其中每个任务都可通过唯一URL访问,以便调度程序任务可以执行正确的HTTP / HTTPS请求

  2. 创建一个新的WebAPI / Wep API,它接受请求(就像中间人一样),并按需使用Azure管理库按需编程运行现有的Web作业。

  3. 如果这些策略有任何帮助,请告诉我。

答案 2 :(得分:1)

要从您的网站调用WebJob,不是一个好主意,而是您可以在您的网站中添加WebJob代码并简单地调用该代码。您仍然可以从您的网站内轻松使用WebJob SDK。

https://github.com/Azure/azure-webjobs-sdk-samples

我们不建议从您的网站调用WebJob,因为调用包含一个秘密,而不是存储在您的网站上(部署凭据)。

<强>建议: 要分离WebJob和网站代码,最好的办法是使用队列进行通信,WebJob会侦听队列,并且网站会将请求推送到队列