我的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");
}
}
我需要做些什么才能让它在调试器中运行?
答案 0 :(得分:10)
我猜你在Azure中使用相同的存储帐户以及在本地调试它时?如果是这种情况 - TimeTrigger作为单例运行,这意味着它需要获取一个锁才能执行。如果您的webjob已在Azure中运行,那么您尝试调试的本地版本无法获取锁定。
为了避免这种情况,只需使用不同的存储帐户即可生成" Azure版本和本地本地开发。
我还建议启用"开发设置" - config.UseDevelopmentSettings(); - 在本地调试时。如果您启用它,您将看到消息"无法获取功能锁定..." (或类似的东西)。
答案 1 :(得分:1)
在this主题中查看Jason Haley的评论:
(完全破解,但应该可以工作)在调试时重命名该函数,因此 锁侦听器Blob名称将不同。
这个技巧对我有用。也许为了减少黑客行为,您可以使用Disable属性创建计时器触发的功能,该功能仅在您的本地环境中启用:
创建用于处理逻辑的“ MyFunction”。这是将在您的Azure应用程序中运行的程序。注意docs所建议的RunOnStartup = false。
[FunctionName("MyFunction")]
public async Task RunJob(
[TimerTrigger("0 0 0 * * *", RunOnStartup = false)] TimerInfo timer)
{
//logic here
}
使用Disable属性和其他方法名称创建“ MyFunction-Local”。所有这些操作就是调用上面的方法。
[FunctionName("MyFunction-Local")]
[Disable("Disable_MyFunction")]
public async Task RunJobLocal(
[TimerTrigger("0 0 0 * * *", RunOnStartup = true)] TimerInfo timer)
{
RunJob(timer);
}
在本地应用程序配置中,设置{"Disable_MyFunction" = false}
,而对于在Azure中运行的应用程序,将其设置为true。