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

l--*_*''' 0 .net c# azure azure-functions visual-studio-2017

我希望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}");
    }
}
Run Code Online (Sandbox Code Playgroud)

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

Jer*_*Liu 5

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

查看Wiki了解详细信息。

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

  • 这只是部分正确。如果它正在运行并且您手动触发它,则可以同时运行多个计时器触发器。 (2认同)
  • 我还有另一个问题:当我在本地运行计时器触发的编排时,它会运行多个实例。那么行为与蔚蓝环境有什么不同吗? (2认同)