【问题标题】:Continuous Azure WebJob with Http Triggered Functions具有 Http 触发函数的连续 Azure WebJob
【发布时间】:2017-03-15 18:05:28
【问题描述】:

我目前有一个 azure webjob,它执行从一个数据库到另一个数据库的每日同步,但也想添加手动触发同步的功能。我在webjob项目中设置了如下功能:

public static void SyncData([TimerTrigger("0 0 5 * * *", RunOnStartup = false)] TimerInfo timerInfo) { }

[NoAutomaticTrigger]
public static Task SyncAll(TraceWriter log){ }
[NoAutomaticTrigger]
public static Task SyncBranches(TraceWriter log){ }
[NoAutomaticTrigger]
public static Task SyncCustomers(TraceWriter log){ }
[NoAutomaticTrigger]
public static Task SyncInventory(TraceWriter log){ }

我可以在 webjob 下的 Kudu 仪表板中看到这些功能,但我不确定如何使用 MS 文档 (here) 中列出的 http 请求触发这些功能:

http://<yourapp>.azurewebsites.net/api/<funcname> 

当我向该端点发出请求时,我收到 404 响应 - 我需要做什么才能通过 http 请求手动触发这些功能?

谢谢, 瑞恩

【问题讨论】:

    标签: c# azure azure-webjobs


    【解决方案1】:

    我们可以使用 Kudu WebJob API 来启动或停止一个连续的工作

    POST https://{user}:{password}@{sitename}.scm.azurewebsites.net/api/continuouswebjobs/{job name}/start

    我们可以从 Azure WebApp publishSetting 文件中获取用户和密码信息。我们可以从门户网站下载文件

    使用 fiddler 测试 Rest API

    注意:如何创建Azure函数请参考document

    更新:

    有没有一种方法可以触发该连续工作中的特定功能?

    根据我的经验,我找不到直接在连续作业中触发特定功能的方法或 Rest API。

    我的解决方法是我们可以使用 Webjob QueueTrigger。根据队列消息信息触发特定功能。 我们可以创建一个WebJob with QueueTrigger

    以下是我根据你的代码的详细步骤。

    1.为触发器创建Azure存储队列

    2.创建一个Webjob项目并添加如下代码

     public static void SyncData([QueueTrigger("backup")] string logMessage, TextWriter logger)
        {
            Console.WriteLine($"Start time:{DateTime.Now}");
            switch (logMessage.ToLower())
            {
                case "syncall":
                    SyncAll(logger);
                    break;
                case "syncbranches":
                    SyncBranches(logger);
                    break;
                case "synccustomers":
                    SyncCustomers(logger);
                    break;
                case "syncinventory":
                    SyncInventory(logger);
                    break;
                default:
                    Console.WriteLine("Default case");
                    break;
            }
            Console.Write($"Endtime:{DateTime.Now}");
    
        }
        [NoAutomaticTrigger]
        public static Task SyncAll(TextWriter log)
        {
    
            Console.WriteLine("SyncAll :"+DateTime.Now);
            return null;
            //await Task.Delay(10);
        }
    
        [NoAutomaticTrigger]
        public static Task SyncBranches(TextWriter log)
        {
            Console.WriteLine("SyncBranches :" + DateTime.Now);
            return null;
        }
    
        [NoAutomaticTrigger]
        public static Task SyncCustomers(TextWriter log)
        {
            Console.WriteLine("SyncCustomers :" + DateTime.Now);
            return null;
        }
    
        [NoAutomaticTrigger]
        public static Task SyncInventory(TextWriter log)
        {
            Console.WriteLine("SyncInventory :" + DateTime.Now);
            return null;
        }
    

    3.使用 Azure Storage Queue REST API 创建队列消息。

    4.从控制台检查结果。

    【讨论】:

    • 谢谢汤姆 - 有没有办法可以在连续工作中触发特定功能?停止和启动当前作业不会运行任何功能 - 它只会让预定的功能等待预定的时间正确吗?
    • 如果要在 azure webjob 中触发特定功能,我的解决方法是使用队列触发器。我在答案中更新了更多细节。
    【解决方案2】:

    您正在查看 Azure Functions 的文档,但看起来您正在使用 WebJobs(与 Azure Functions 不同)。

    我建议改用 Azure Functions,在这种情况下,您的场景会变得更加简单。

    【讨论】:

      【解决方案3】:

      当你有

      SyncData([TimerTrigger("0 0 5 * * *", RunOnStartup = false)]
      

      这是连续作业,恕我直言不是最佳的,您可以将其更改为真正按计划运行(这意味着它在空闲时不会消耗资源),然后您可以简单地从 UI 运行它 为此,您必须删除计时器触发器:

      public static void SyncData() { }
      

      在这种情况下,您的 WebJob 项目根目录中的 Settings.job 文本文件中提供了计划,其内容为:

      {
        "schedule": "0 0 5 * * *",
        "is_singleton": true
      }
      

      并且还要调整一下Program.cs:

      //now it will start your functions manually
      var host = builder.Build();
      using (host)
      {
        var functions = host.Services.GetService(typeof(Functions)) as Functions;
        //in my case it is Run method, but I guess you have there SyncData
        await functions.Run();
      }
      //when it was continious
      //var host = builder.Build();
      //using (host)
      //{
      //    await host.RunAsync(ct);
      //    tokenSource.Dispose();
      //}
      

      您还需要将您的工作类型设置为触发,重新发布并删除旧的连续工作。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-03-03
        • 1970-01-01
        • 2019-04-07
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多