【问题标题】:Why is my Azure WebJobs "settings.job" file being ignored?为什么我的 Azure WebJobs“settings.job”文件被忽略?
【发布时间】:2016-04-18 13:35:51
【问题描述】:

当 Azure WebJobs 因任何原因停止或重新启动时,在主机控制台进程终止之前有 5 秒的默认宽限期。显然,当 WebJob 发布到 Azure 时,可以通过在 WebJob 中包含一个“settings.job”文件来增加这个时间段,如explained here。不幸的是,我无法让它在我的网站上运行,并且关闭时间为始终 5 秒,尽管这是发布到设置为“始终开启”的基本应用服务的连续 WebJob。

根据链接中的示例代码,我的 Program.cs 如下所示:

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

我的 Functions.cs 看起来像这样:

public class Functions
{
    public static async Task ProcessQueueMessageAsync(
        [QueueTrigger("testq")] string message, TextWriter log,
        CancellationToken cancellationToken)
    {
        Console.WriteLine("Function started.");
        try
        {
            await Task.Delay(TimeSpan.FromMinutes(10), cancellationToken);
        }
        catch (TaskCanceledException)
        {
            Shutdown().Wait();
        }
        Console.WriteLine("Function completed succesfully.");
    }

    private static async Task Shutdown()
    {
        Console.WriteLine("Function has been cancelled. Performing cleanup ...");
        await Task.Delay(TimeSpan.FromSeconds(30));
        Console.WriteLine("Function was cancelled and has terminated gracefully.");
    }
}

我已将 settings.job 文件添加到项目中,并在 Visual Studio 的属性中将其设置为“始终复制”。文件内容如下:

{ "stopping_wait_time": 60 }

WebJob 随网站一起发布。通过使用 Kudu 工具并转到调试控制台,我可以验证“settings.job”文件是否被复制到与 WebJob 主机可执行文件相同的位置:

但是,如果我查看链接 https://xxx.scm.azurewebsites.net/api/continuouswebjobs,返回的 JSON 根本不包含任何设置:

{
    "status":"Stopped",
    "detailed_status":"f9e13c - Stopped\r\n",
    "log_url":"https://...",
    "name":"WebJobTest",
    "run_command":"WebJobTest.exe",
    "url":"https://...",
    "extra_info_url":"https://...",
    "type":"continuous",
    "error":null,
    "using_sdk":true,
    "settings":{
    }
}

因此,当我从 Azure 门户停止 WebJob 时,我最终会在日志中看到类似的内容:

[04/18/2016 12:53:12 > f9e13c: SYS INFO] Run script 'WebJobTest.exe' with script host - 'WindowsScriptHost'
[04/18/2016 12:53:12 > f9e13c: SYS INFO] Status changed to Running
[04/18/2016 12:53:13 > f9e13c: INFO] Found the following functions:
[04/18/2016 12:53:13 > f9e13c: INFO] WebJobTest.Functions.ProcessQueueMessageAsync
[04/18/2016 12:53:13 > f9e13c: INFO] Job host started
[04/18/2016 13:01:58 > f9e13c: INFO] Executing: 'Functions.ProcessQueueMessageAsync' - Reason: 'New queue message detected on 'testq'.'
[04/18/2016 13:01:58 > f9e13c: INFO] Function started.
[04/18/2016 13:02:47 > f9e13c: SYS INFO] Status changed to Disabling
[04/18/2016 13:02:53 > f9e13c: SYS INFO] Detected WebJob file/s were updated, refreshing WebJob
[04/18/2016 13:02:53 > f9e13c: SYS INFO] Status changed to Stopping
[04/18/2016 13:02:53 > f9e13c: INFO] Function has been cancelled. Performing cleanup ...
[04/18/2016 13:02:58 > f9e13c: ERR ] Thread was being aborted.
[04/18/2016 13:02:58 > f9e13c: SYS INFO] WebJob process was aborted
[04/18/2016 13:02:58 > f9e13c: SYS INFO] Status changed to Stopped

请注意“状态更改为停止”和“线程正在中止”之间的标准 5 秒间隔。

为什么“settings.job”文件被忽略了?

【问题讨论】:

  • 对于连续工作,我认为它的工作方式不同。你需要寻找WEBJOBS_SHUTDOWN_FILE blog.amitapple.com/post/2014/05/webjobs-graceful-shutdown/…
  • 验证settings.job文件是否在webjob目录的根目录下,你可以浏览到https://{sitename}.scm.azurewebsites.net/debugconsole然后到目录:@987654332 @
  • 在 settings.job 中应该是 { "stopping_wait_time": 60, "is_singleton": true }
  • @DavidEbbo 类似的是,但是在另一个问题上,Azure 基础架构正在检测“stopping_wait_time”值,而我的值似乎被忽略了。

标签: c# azure azure-webjobs


【解决方案1】:

问题是您的settings.job 文件有两组 UTF-8 BOM,这是非常不寻常的,并且会导致解析器出错。

具体来说,它的开头有以下序列(使用十六进制编辑器查看):EF BB BF EF BB BF。通常情况下,UTF-8 BOM 就是EF BB BF

您使用的是什么编辑器导致了这种情况?

无论如何,一旦你修复它,它应该可以正常工作。

【讨论】:

  • 就是这样!我更改了文件以删除重复的 BOM,重新部署了 Web 应用程序,它按预期工作!非常感谢,我自己永远也找不到。
  • 至于最初如何在文件中出现欺骗 BOM:我在 VS 中的项目中添加了一个新项目(右键单击,添加 > 新项目),选择“文本文件”并将名称更改为“settings.job”。然后我从here 复制了文件的内容,将它们粘贴到文件中,然后保存。这给了我欺骗的 BOM。我认为这一定是我正在使用的网络浏览器(Chrome)的一个特性,因为有时我将文本粘贴到文件中时会得到欺骗 BOM,而有时却不会。
  • 奇怪。我希望编辑更清楚地表明它有一些时髦的东西。记事本实际上以一种非常特殊的方式处理该文件,它以不同的大小显示一些文本,并且编辑混乱了。
  • 其他人遇到了同样的here
  • 对于那些有这个问题的人(我知道,2019)。我没有 BOM 问题,但我有空格(我也是从 GitHub 复制的)。所以,这个{ "stopping_wait_time": 60 } 没有用。这{"stopping_wait_time":60} 工作。您可以使用https://xxx.scm.azurewebsites.net/api/continuouswebjobs 进行检查。更改后,我看到了那里的值。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-09-30
  • 2016-06-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多