Azure 函数甚至在本地执行 RunOnStartup = false

Som*_*mar 6 azure azure-functions azure-functions-runtime azure-functions-core-tools

根据我的理解 Azure 函数将执行

如果RunOnStartup = true

   1. on startup 
   2. if a host changed 
   3. a new deployment happen
   4. on schedule time
Run Code Online (Sandbox Code Playgroud)

并且,如果RunOnStartup = false 或未定义

   1. on schedule time only
Run Code Online (Sandbox Code Playgroud)

但是当我使用RunOnStartup = false在本地运行它时,它也在启动时执行,并且在 azure 门户上运行良好。任何人都可以请建议为什么会发生?

更新:- 功能代码:-

    public static void Run([TimerTrigger("0 30 3 * * *", RunOnStartup = false)]TimerInfo myTimer, TraceWriter log, ExecutionContext executionContext)
    {
        log.Info($"Function1- Timer trigger function executed at: {DateTime.Now}");
        try
        {
            //main work
        }
        catch (Exception ex)
        {
            log.Error(ex.Message, ex);
        }
        finally
        {
            log.Info($"Function1 - Timer trigger function ENDED at: {DateTime.Now}");
        }
    }
Run Code Online (Sandbox Code Playgroud)

控制台输出:-

   your worker runtime is not set. As of 2.0.1-beta.26 a worker runtime setting is
Run Code Online (Sandbox Code Playgroud)

必需的。请运行func settings add FUNCTIONS_WORKER_RUNTIME <option>或添加 FUNCTION S_WORKER_RUNTIME 到您的 local.settings.json 可用选项:dotnet、node、python

              %%%%%%
             %%%%%%
        @   %%%%%%    @
      @@   %%%%%%      @@
   @@@    %%%%%%%%%%%    @@@
 @@      %%%%%%%%%%        @@
   @@         %%%%       @@
     @@      %%%       @@
       @@    %%      @@
            %%
            %

  Azure Functions Core Tools (2.3.148 Commit hash:     f9b3db04f9833b431f1b001efb3e5783a169ebfc)
  Function Runtime Version: 2.0.12210.0
  [19-Dec-18 8:22:47 AM] Building host: startup suppressed:False, configuration suppressed: False
  [19-Dec-18 8:22:47 AM] Reading host configuration file 'D:\path****\host.json'
  [19-Dec-18 8:22:47 AM] Host configuration file read:
  [19-Dec-18 8:22:47 AM] {
  [19-Dec-18 8:22:47 AM]   "version": "2.0"
  [19-Dec-18 8:22:47 AM] }
  [19-Dec-18 8:22:47 AM] Initializing Host.
  [19-Dec-18 8:22:47 AM] Host initialization: ConsecutiveErrors=0, StartupCount=1
  [19-Dec-18 8:22:47 AM] Starting JobHost
  [19-Dec-18 8:22:47 AM] Starting Host (HostId=boldsombirk-85417686, InstanceId=4f41b83d-022e-4e75-b75b-528890f62058, Version=2.0.12210.0, ProcessId=7012, AppDomainId=1, InDebugMode=False, InDiagnosticMode=False, FunctionsExtensionVersion=)
  [19-Dec-18 8:22:47 AM] Loading functions metadata
  [19-Dec-18 8:22:48 AM] 1 functions loaded
  [19-Dec-18 8:22:48 AM] Generating 1 job function(s)
  [19-Dec-18 8:22:48 AM] Found the following functions:
  [19-Dec-18 8:22:48 AM] Function1.Run
  [19-Dec-18 8:22:48 AM]
  [19-Dec-18 8:22:48 AM] Host initialized (673ms)
  [19-Dec-18 8:22:49 AM] Executing 'Function1' (Reason='Timer fired at 2018-12-19T13:52:49.5718606+05:30', Id=e1603f8f-41d0-492e-8674-d5771813422d)
  [19-Dec-18 8:23:41 AM] Function1 - Timer trigger function executed at: 19-Dec-18 1:53:41 PM
Run Code Online (Sandbox Code Playgroud)

Jer*_*Liu 6

让我们从一个例子开始,一个定时器触发器以0 */5 * * * *schedule at开始12/19/2018 4:01:00 PM,我们可以看到 schedule 打印

12/19/2018 4:05:00 PM
12/19/2018 4:10:00 PM
12/19/2018 4:15:00 PM
12/19/2018 4:20:00 PM
12/19/2018 4:25:00 PM
Run Code Online (Sandbox Code Playgroud)

但是,我们在4:02 PM. 然后在 处再次运行它4:08 PM,我们可以看到定时器触发器在启动时执行。

发生这种情况是因为 ScheduleStatus(如下所示)已在触发器第一次启动时存储在 blob 存储中。当我们再次运行项目时,定时器触发器读取现有的Next计划时间并将其与当前时间进行比较。如果预定Next时刻已过,定时器触发器在启动时立即执行。

 // I am in UTC+8:00 time zone
{
    "Last":"0001-01-01T00:00:00",
    "Next":"2018-12-19T16:05:00+08:00",
    "LastUpdated":"2018-12-19T16:02:12.7071566+08:00"
}
Run Code Online (Sandbox Code Playgroud)

按照文档中的示例处理过时计划的执行。IsPastDue当当前函数调用晚于预定时间时,该属性为 true。

[FunctionName("TimerTriggerCSharp")]
public static void Run([TimerTrigger("0 */5 * * * *")]TimerInfo myTimer, ILogger log)
{
    if(myTimer.IsPastDue)
    {
        log.LogInformation("Timer is running late!");
    }
    log.LogInformation($"C# Timer trigger function executed at: {DateTime.Now}");
}
Run Code Online (Sandbox Code Playgroud)