繁体   English   中英

连续 Azure 具有 Http 触发函数的 WebJob

[英]Continuous Azure WebJob with Http Triggered Functions

我目前有一个 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 文档( 此处)中列出的 http 请求触发这些功能:

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

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

谢谢,瑞安

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

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

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

在此输入图像描述

使用fiddler测试Rest API

在此输入图像描述

注意 :如何创建Azure功能请参考文档

更新:

有没有办法可以在连续工作中触发特定功能?

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

我的工作是我们可以使用Webjob QueueTrigger。 根据队列消息信息触发sepcific功能。 我们可以使用QueueTrigger创建一个WebJob

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

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功能的文档,但看起来您正在使用WebJobs(与Azure功能不同)。

我建议使用Azure功能,在这种情况下,您的场景变得更加直接。

当你有

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();
//}

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM