连续 WebJob 自动停止

Posted

技术标签:

【中文标题】连续 WebJob 自动停止【英文标题】:continuous WebJob stops automatically 【发布时间】:2015-04-14 16:15:57 【问题描述】:

我有一个与网站关联的 Web 作业,它被配置为连续运行,它所做的只是监视队列中的消息并对其进行处理。

我的网站处于共享模式,目前几乎没有任何流量,因此我设置了每 1 分钟请求一次主页的虚拟服务,以防止网站在此测试中被关闭,并且接缝按预期工作,我可以注意到网站本身没有关闭。但是,除非我转到 Azure 管理门户并查找 webjob 状态,否则此 webjob 会在大约一个小时内关闭。我去那里的那一刻,它会再次启动,然后在几分钟到一个小时内关闭。

此网络作业的日志文件显示如下内容:

[02/13/2015 09:19:45 > 4660f6: INFO] Job host started
[02/13/2015 10:19:41 > 4660f6: SYS INFO] WebJob is still running
[02/13/2015 10:20:35 > 4660f6: SYS INFO] WebJob is stopping due to website shutting down
[02/13/2015 10:20:35 > 4660f6: SYS INFO] Status changed to Stopping
[02/13/2015 10:20:35 > 4660f6: INFO] Job host stopped
[02/13/2015 10:20:35 > 4660f6: SYS INFO] Status changed to Success
[02/13/2015 10:20:35 > 4660f6: SYS INFO] Status changed to Stopped

我可以看到我的网站仍在运行并返回主页,但作业本身已停止。

现在,当我登录管理门户查找状态时,我可以在日志中看到:

[02/13/2015 10:20:35 > 4660f6: SYS INFO] Status changed to Success
[02/13/2015 10:20:35 > 4660f6: SYS INFO] Status changed to Stopped
[02/13/2015 14:56:15 > 4660f6: SYS INFO] Status changed to Starting
[02/13/2015 14:56:17 > 4660f6: SYS INFO] Run script 'WebJobs.exe' with script host - 'WindowsScriptHost'
[02/13/2015 14:56:17 > 4660f6: SYS INFO] Status changed to Running
[02/13/2015 14:56:19 > 4660f6: INFO] Found the following functions:
[02/13/2015 14:56:19 > 4660f6: INFO] WebJobs.NotificationsProgram.ProcessQueueMessage
[02/13/2015 14:56:19 > 4660f6: INFO] WebJobs.NotificationsProgram.PublishNotification
[02/13/2015 14:56:19 > 4660f6: INFO] WebJobs.NotificationsProgram.ProcessMessages
[02/13/2015 14:56:19 > 4660f6: INFO] Job host started

关于如何确保网站处于活动状态时 Webjob 处于活动状态的任何想法?或者至少让网站在返回运行状态时也启动 webjob。

更新 1

我的webjob本身就是一个非常简单的,如下图:

static void Main(string[] args)

    JobHost host = new JobHost();
    host.RunAndBlock();

并且触发函数看起来接近于这样:

public static void WriteLogPOCO([QueueTrigger("logqueue")] BlobInformation blobInfo, TextWriter logger)

    logger.WriteLine("Queue message refers to blob: " + blobInfo.BlobName);

我必须在这里做些什么来表明这项工作应该遵循网站的生命周期,即每次启动网站时启动。

更新 2

我尝试查看 Process Explorer,当 WebJobs 停止时,我看到了三件事之一。如果不进入管理门户,我不知道如何查看作业日志,因此目前不知道实际的日志。

但我确信作业没有运行,因为它不会处理队列中的任何消息,直到我进入管理门户。

pingdom 的结果如下图所示,表明网站本身正在运行,没有任何中断:

问候 基兰

【问题讨论】:

【参考方案1】:

如果您要在 Shared 模式下运行,则会出现这种行为。如果您有持续运行的网络作业,建议您打开始终开启。然而,这是基本标准的一个特性,所以你需要改变你的模式或重新考虑你的解决方案。

另外,请注意来自this link 的这些注释。

【讨论】:

文档表明作业遵循网站本身的生命周期,那么为什么我必须转到始终在线? 保持您的网站运行,从而防止您的网络作业停止。 当网站本身启动时,我怎样才能启动此门户上的所有网络作业.. 这可能吗? “免费”网站更新。我不知道它是否也适用于“共享”网站。 “截至 2014 年 3 月,如果没有对 scm(部署)站点的请求并且网站的门户未在 Azure 中打开,则处于免费模式的网站可能会在 20 分钟后超时。对实际站点的请求不会重置此问题。”来源:azure.microsoft.com/en-us/documentation/articles/… @FabrizioAccatino:我有一个解决我的问题的方法,可能对你也有帮助。要求是确保我们调用了 scm 站点并且作业开始运行。因此,在我的代码中,当我向队列发布消息时,我使用部署凭据显式调用 scm 站点,它启动了我的工作。 Andrzej Turski 在这里帮助我编写了他的代码 - ***.com/questions/28904186/…【参考方案2】:

网络作业停止,因为网站正在关闭。在日志中,您有以下行:

[02/13/2015 10:20:35 > 4660f6: SYS INFO] WebJob is stopping due to website shutting down

【讨论】:

我希望网站恢复正常后开始工作,不是这样吗?

以上是关于连续 WebJob 自动停止的主要内容,如果未能解决你的问题,请参考以下文章

Laravel 队列和 Azure WebJob

Azure - 将 WCF 服务作为 WebJob 运行

Azure 触发的 Webjob - 检测 webjob 何时停止

如何在没有“始终开启”的情况下保持 Azure WebJob 运行

触发的网络作业是不是在所有实例上运行?

SceneKit - 停止连续循环 Collada 动画