WebJob 运行失败,原因是:System.Threading.ThreadAbortException:线程被中止
Posted
技术标签:
【中文标题】WebJob 运行失败,原因是:System.Threading.ThreadAbortException:线程被中止【英文标题】:WebJob run failed due to: System.Threading.ThreadAbortException: Thread was being aborted 【发布时间】:2015-04-30 06:51:34 【问题描述】:我有一个 Azure WebJob 在运行仅 20 分钟后失败,并显示以下日志输出:
[02/27/2015 00:30:11 > 3e9b72: SYS INFO] Status changed to Initializing
[02/27/2015 00:30:21 > 3e9b72: SYS INFO] Run script 'Namespace.Class.DataProcessor.exe' with script host - 'WindowsScriptHost'
[02/27/2015 00:30:21 > 3e9b72: SYS INFO] Status changed to Running
[02/27/2015 00:30:23 > 3e9b72: INFO] Found the following functions:
[02/27/2015 00:30:23 > 3e9b72: INFO] Namespace.Class.DataProcessor.Functions.ManualTrigger
[02/27/2015 00:30:23 > 3e9b72: INFO] Executing: 'Functions.ManualTrigger' because This was function was programmatically called via the host APIs.
[02/27/2015 00:51:35 > 3e9b72: ERR ] Thread was being aborted.
[02/27/2015 00:51:35 > 3e9b72: SYS INFO] WebJob process was aborted
[02/27/2015 00:51:35 > 3e9b72: SYS INFO] Status changed to Stopped
[02/27/2015 00:51:35 > 3e9b72: SYS INFO] Status changed to Failed
[02/27/2015 00:51:35 > 3e9b72: SYS ERR ] WebJob run failed due to: System.Threading.ThreadAbortException: Thread was being aborted.
at Kudu.Core.Jobs.BaseJobRunner.RunJobInstance(JobBase job, IJobLogger logger, String runId)
at Kudu.Core.Jobs.TriggeredJobRunner.<>c__DisplayClass2.<StartJobRun>b__0(Object _)
按计划每天在系统安静时启动一次,20 分钟后它会因该错误而失败。 此错误仅在作业由调度程序自动触发时发生。如果从站点下的 Azure WebJob 面板手动触发,即使运行多个小时也不会出错。
工作申请输出一个“。”每隔几个步骤就可以防止 Azure 认为它处于空闲状态。我还在作业运行的网站上配置了以下设置,以防止它在需要一段时间才能响应或向日志输出某些内容时超时:
WEBJOBS_IDLE_TIMEOUT = 14400
SCM_COMMAND_IDLE_TIMEOUT = 14400
作业操作是触发作业的 POST 请求,我怀疑它与手动启动作业的机制相同(并且不会超时)。
如何防止此操作在 20 分钟后失败?我需要更改/添加什么设置才能让作业运行超过 20 分钟?
【问题讨论】:
你解决过这个问题吗?我有同样的问题。 这似乎是相关的 - ***.com/questions/27939766/… @jrummell 我的解决方案是将作业拆分为更集中的功能并更频繁地运行它们,因为它是构建数据量导致它需要这么长时间。现在功能不会超过 10 分钟,因此它们不会被关闭。还将测试“始终开启”解决方案,然后可能还会测试“stopping_wait_time”设置,看看是否有效。 【参考方案1】:确保将您的网站配置为在启用“始终开启”设置的情况下运行。这需要标准级别的网站(在免费网站中不可用)。来自documentation:
始终开启。默认情况下,如果 Web 应用程序空闲了一段时间,它们会被卸载 一段的时间。这使系统可以节省资源。在基本或 标准模式,您可以启用 Always On 以保持应用程序加载所有 时间。 如果您的应用运行连续的网络作业,您应该启用 Always 开,否则网络作业可能无法可靠运行。
【讨论】:
相关网站确实启用了此设置。 Azure Web Jobs 的触发方式来自 GET/POST,因此即使站点已卸载,它也会唤醒站点,这与 Hangfire 等内部调度系统不同。启用此设置并不能防止错误,它似乎与实际触发请求需要超过 20 分钟才能完成有关,并且没有明确的增加超时的方法。以上是关于WebJob 运行失败,原因是:System.Threading.ThreadAbortException:线程被中止的主要内容,如果未能解决你的问题,请参考以下文章
WinSCP 无法在 Azure 应用服务上作为 WebJob 运行