Azure WebJob不会在调试器中本地运行

时间:2016-10-09 16:33:57

标签: azure azure-webjobs

我的Azure WebJob曾经在VS2015调试器中运行,但我发现它逐渐变得非常间歇,现在根本不会运行。我将其部署到Azure时工作正常。该作业标记为RunOnStartUp。

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

public class TestJob : BaseJob
{
    public static async Task StartupJob([TimerTrigger("05:00:00", RunOnStartup = true)] TimerInfo timerInfo, TextWriter log)
    {
        log.WriteLine("StartupJob");
        await Jobs.Test(some params);
        log.WriteLine("Sorted");
    }
}

我需要做些什么才能让它在调试器中运行?

2 个答案:

答案 0 :(得分:10)

我猜你在Azure中使用相同的存储帐户以及在本地调试它时?如果是这种情况 - TimeTrigger作为单例运行,这意味着它需要获取一个锁才能执行。如果您的webjob已在Azure中运行,那么您尝试调试的本地版本无法获取锁定。

为了避免这种情况,只需使用不同的存储帐户即可生成" Azure版本和本地本地开发。

我还建议启用"开发设置" - config.UseDevelopmentSettings(); - 在本地调试时。如果您启用它,您将看到消息"无法获取功能锁定..." (或类似的东西)。

答案 1 :(得分:1)

this主题中查看Jason Haley的评论:

(完全破解,但应该可以工作)在调试时重命名该函数,因此 锁侦听器Blob名称将不同。

这个技巧对我有用。也许为了减少黑客行为,您可以使用Disable属性创建计时器触发的功能,该功能仅在您的本地环境中启用:

  1. 创建用于处理逻辑的“ MyFunction”。这是将在您的Azure应用程序中运行的程序。注意docs所建议的RunOnStartup = false。

     [FunctionName("MyFunction")]
     public async Task RunJob(
         [TimerTrigger("0 0 0 * * *", RunOnStartup = false)] TimerInfo timer)
     {
        //logic here
     }
    
  2. 使用Disable属性和其他方法名称创建“ MyFunction-Local”。所有这些操作就是调用上面的方法。

     [FunctionName("MyFunction-Local")]
     [Disable("Disable_MyFunction")]
     public async Task RunJobLocal(
         [TimerTrigger("0 0 0 * * *", RunOnStartup = true)] TimerInfo timer)
     {
        RunJob(timer);
     }
    
  3. 在本地应用程序配置中,设置{"Disable_MyFunction" = false},而对于在Azure中运行的应用程序,将其设置为true。