时间触发webjob,直到我更改名称后才会触发..

时间:2019-09-13 10:02:20

标签: c# azure-webjobs

我在sdk 3中有一个webjob。

 public class NotificationsFunction
{
    public async Task CustomerNotificationFunctionAsync([TimerTrigger("0 * * * * *")]TimerInfo myTimer, ILogger log)
    log.LogInformation("Running job");

它曾经可以正常运行。现在,如果我尝试在本地调试它,它就会挂起。它找到了函数,但从不触发它: enter image description here

现在,如果我只是在更改名称:

public class NotificationsFunction
{
    public async Task CustomerNotificationFunctionAsyncTest([TimerTrigger("0 * * * * *")]TimerInfo myTimer, ILogger log)
    log.LogInformation("Running job");

它运行完美: enter image description here

当我部署到天蓝色时,我也有同样的问题。 我不知道为什么会发生这种情况(花了我一段时间才找到这个问题)...

有人遇到过这个问题吗?如果可以,该怎么办? 谢谢

1 个答案:

答案 0 :(得分:1)

来自此document

  

TimerTrigger使用WebJobs SDK的Singleton功能来确保在给定的时间仅运行触发函数的单个实例。当JobHost启动时,对于您的每个TimerTrigger函数,都会使用一个Blob租约(单例锁)。此分布式锁可确保您的调度函数仅在单个时间运行。如果当前未租用该函数的Blob,则该函数将获取租约并立即按计划开始运行。如果无法获取Blob租约,则通常意味着该函数的另一个实例正在运行,因此该函数不会在当前主机中启动。

锁定ID基于完全限定的功能名称。

根据sdk 3中的网络作业,您可以使用AddAzureStorageCoreServices

var builder = new HostBuilder()
    .ConfigureWebJobs(b=>
    {
        b.AddTimers();
        b.AddAzureStorageCoreServices();
    })
    .Build();
  

当我部署到天蓝色时,我也有同样的问题。

还请注意,如果您要在本地开发和生产部署之间共享相同的存储帐户,则单锁(blob租约)将被共享。要解决此问题,您可以使用单独的存储帐户进行本地开发,也可以停止在Azure中运行的作业。