带有 Http 触发函数的连续 Azure 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 文档 (here) 中列出的 http 请求触发这些功能:
http://<yourapp>.azurewebsites.net/api/<funcname>
当我向该端点发出请求时,我收到 404 响应 - 我需要做什么才能通过 http 请求手动触发这些功能?
谢谢,
瑞安
您正在查看 Azure Functions 的文档,但看起来您正在使用 WebJobs(不同于 Azure Functions)。
我建议改为使用 Azure Functions,在这种情况下,您的场景会变得更加直接。
我们可以使用 Kudu WebJob API 来启动或停止连续作业
POST https://{user}:{password}@{sitename}.scm.azurewebsites.net/api/continuouswebjobs/{job name}/start
我们可以从 Azure WebApp publishSetting 文件中获取用户和密码信息。我们可以从门户下载文件
使用 fiddler
测试其余部分 API
注意:如何创建Azure函数请参考document.
更新:
is there a way I can trigger a specific function in that continuous job?
根据我的经验,我无法找到一种方法或 Rest API 直接触发连续作业中的特定功能。
我的解决方法是我们可以使用 Webjob QueueTrigger。根据队列消息信息触发特定功能。
我们可以创建一个 WebJob with QueueTrigger
以下是我根据你的代码的详细步骤。
1.Create 用于触发器的 Azure 存储队列
2.Create一个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.Use Azure Storage Queue REST API 创建队列消息。
4.Check 来自控制台的结果。
当你有
SyncData([TimerTrigger("0 0 5 * * *", RunOnStartup = false)]
它是连续作业,恕我直言,这不是最佳选择,您可以将其更改为真正 运行ning 按计划(意味着它在空闲时不会消耗资源),然后您可以 运行 它只是来自 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();
//}
您还需要将您的工作类型设置为触发式,重新发布并删除旧的连续工作。
我目前有一个 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 请求手动触发这些功能?
谢谢, 瑞安
您正在查看 Azure Functions 的文档,但看起来您正在使用 WebJobs(不同于 Azure Functions)。
我建议改为使用 Azure Functions,在这种情况下,您的场景会变得更加直接。
我们可以使用 Kudu WebJob API 来启动或停止连续作业
POST https://{user}:{password}@{sitename}.scm.azurewebsites.net/api/continuouswebjobs/{job name}/start
我们可以从 Azure WebApp publishSetting 文件中获取用户和密码信息。我们可以从门户下载文件
使用 fiddler
测试其余部分 API注意:如何创建Azure函数请参考document.
更新:
is there a way I can trigger a specific function in that continuous job?
根据我的经验,我无法找到一种方法或 Rest API 直接触发连续作业中的特定功能。
我的解决方法是我们可以使用 Webjob QueueTrigger。根据队列消息信息触发特定功能。 我们可以创建一个 WebJob with QueueTrigger
以下是我根据你的代码的详细步骤。
1.Create 用于触发器的 Azure 存储队列
2.Create一个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.Use Azure Storage Queue REST API 创建队列消息。
4.Check 来自控制台的结果。
当你有
SyncData([TimerTrigger("0 0 5 * * *", RunOnStartup = false)]
它是连续作业,恕我直言,这不是最佳选择,您可以将其更改为真正 运行ning 按计划(意味着它在空闲时不会消耗资源),然后您可以 运行 它只是来自 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();
//}
您还需要将您的工作类型设置为触发式,重新发布并删除旧的连续工作。