如何在计时器触发的函数上强制执行单例行为?

时间:2018-12-25 02:48:28

标签: c# .net azure visual-studio-2017 azure-functions

我希望我的Azure函数查看SFTP文件夹,并将新文件移动到其父文件夹。

我的脚手架看起来像这样。

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

我们如何强制在任何给定时间运行此函数的一个且只有一个实例?

1 个答案:

答案 0 :(得分:4)

根据设计,TimerTrigger使用WebJobs SDK的Singleton功能来确保在给定的时间仅运行触发函数的单个实例。因此,我们无需执行其他任何操作即可执行该操作。

检查wiki以获得详细信息。

  

当JobHost启动时,对于您的每个TimerTrigger函数,都会获取一个Blob租约(单例锁)。这种分布的锁确保了您的调度函数在任何时候都只在运行一个实例。如果当前未租用该函数的Blob,则该函数将获取租约并立即按计划开始运行。如果无法获取Blob租约,则通常意味着该函数的另一个实例正在运行,因此该函数不会在当前主机中启动。