2

我有一个希望被时间触发的网络作业:

public class ArchiveFunctions
{
    private readonly IOrderArchiver _orderArchiver;

    public ArchiveFunctions(IOrderArchiver orderArchiver)
    {
        _orderArchiver = orderArchiver;
    }

    public async Task Archive([TimerTrigger("0 */5 * * * *")] TimerInfo timer, TextWriter log)
    {
            log.WriteLine("Hello world");
    }
}

我的程序.cs:

public static void Main()
    {
        var config = new JobHostConfiguration
        {
            JobActivator = new AutofacJobActivator(RegisterComponents())
        };

        config.UseTimers();

        var host = new JobHost(config);

        // The following code ensures that the WebJob will be running continuously
        host.RunAndBlock();

    }

我的发布设置.json:

{
  "$schema": "http://schemastore.org/schemas/json/webjob-publish-settings.json",
  "webJobName": "OrdersArchiving",
  "runMode": "OnDemand"
}

这是它在 azure 门户上的样子: 在此处输入图像描述

我的问题是作业运行,我有 hello world,但作业保持运行状态并且它得到一个超时错误消息:

[02/05/2018 15:34:05 > f0ea5f: ERR ] 命令 'cmd /c ""Ores.Contr ...' 由于 121 秒内没有输出或 CPU 活动而中止。如果需要,您可以增加 SCM_COMMAND_IDLE_TIMEOUT 应用程序设置(或 WEBJOBS_IDLE_TIMEOUT,如果这是一个 WebJob)。

我能做些什么来解决这个问题?我有一个疯狂的猜测 RunAndBlock 可能是一个问题..但我没有看到解决方案..谢谢!

编辑:

我已经测试了 Rob Reagan 的答案,它确实有助于解决错误,谢谢!在我的同一项服务中,我还有另一项时间触发的工作(在核心中完成,而我的不是)。 在此处输入图像描述

您可以看到 Webjob.Missions 已“触发”,并且上次运行时的状态更新。你也可以看到上面的时间表。我想为我的“OrdersArchiving”提供相同的功能。我怎样才能做到这一点?谢谢!

4

1 回答 1

3

将运行模式更改为连续且不触发。TimerTrigger 将处理执行您放置它的方法。

此外,请确保您没有使用免费层来托管您的 WebJob。二十分钟不活动后,应用程序将暂停并等待新的 HTTP 请求将其唤醒。

此外,请确保您已在 Web 应用设置上启用 Always On,以防止相同的事情发生在更高服务层的 Web 应用上。

编辑 Tom 询问如何按计划为触发的 WebJob 调用方法。有两种选择:

  1. 将作业设置为已触发并使用 settings.json 文件设置计划。你可以在这里阅读。

  2. 使用 Azure 调度程序通过 HTTP 调用方法。Azure 计划程序是一个可以预配的单独 Azure 服务。它有一个免费层,可能足以供您使用。请在此处查看 David Ebbo 的帖子。

于 2018-02-05T15:52:57.393 回答