Azure WebJobs SDK 3.0 中 'Settings.job' 和 'TimerTrigger' 之间的区别是什么
Whats is the difference between 'Settings.job' and 'TimerTrigger' in Azure WebJobs SDK 3.0
有很多教程使用以下代码通过 WebJob SDK 3.0 库创建 Webjobs。具体来说 'TimerTrigger'
public void DoSomethingUseful([TimerTrigger("0 */1 * * * *", RunOnStartup = false)] TimerInfo timerInfo, TextWriter log)
{
// Act on the DI-ed class:
string thing = _usefulRepository.GetFoo();
Console.WriteLine($"{DateTime.Now} - {thing}");
}
以上示例应该 运行 此方法作为每 1 分钟一次的 Web 作业。然而,这不起作用。
我在包含 setting.job 文件时设法让网络作业正常工作。
setting.job: { "schedule": "0 */1 * * * *" }
我的问题是这两者有什么区别?
更新:
请转到 azure webjobs 日志,然后您可以根据 SDK 定义的 timerTrigger 实际看到它 运行s(即使 Schedule 是 n/a,并且 settings.job为空,无所谓):
简而言之,当使用webjob sdk 3.x时,您可以使用TimerTrigger
属性来运行您定义的函数。不使用 webjobs SDK(如使用 .zip 文件或从 visual studio 发布控制台项目),您可以使用 setting.job 来定义计时器而不是 TimerTrigger
属性。
1.When 您正在使用 webjobs SDK 3.x 进行定时器触发,您应该添加这行代码:config.AddTimers();
.
这是我使用 webjobs SDK 的代码 3.x(这是一个在 visual studio 中创建的 .net core 2.2 控制台项目):
最新版本的软件包:Microsoft.Azure.WebJobs
/ Microsoft.Azure.WebJobs.Extensions
/ Microsoft.Extensions.Logging.Console
Program.cs中的代码:
class Program
{
static void Main(string[] args)
{
var builder = new HostBuilder()
.ConfigureWebJobs(config =>
{
config.AddTimers();
config.AddAzureStorageCoreServices();
})
.ConfigureLogging((context, b) =>
{
b.AddConsole();
}
)
.Build();
builder.Run();
}
}
然后创建一个新文件,如SayHelloWebJob.cs,并在其中编写代码:
public class SayHelloWebJob
{
public void ProcessCollateFiles([TimerTrigger("0 */1 * * * *", RunOnStartup = false)]TimerInfo timerInfo,TextWriter writer)
{
writer.WriteLine("hi, it is a testing running");
Console.WriteLine("test");
}
}
请注意,在 appsettings.json 文件中,添加您的存储连接字符串,如下所示:
{
"AzureWebJobsStorage": "DefaultEndpointsProtocol=https;AccountName=xxx;AccountKey=xxx;EndpointSuffix=core.windows.net"
}
然后运行工程,可以看到函数是按1分钟触发的:
2.For settings.job,例如。如果您只是创建一个控制台项目,并且不使用 webjobs sdk。由于您没有使用 webjobs sdk,因此不能使用 timerTrigger 属性。此时,您可以在该项目中包含 settings.job 文件(在 属性 中,将 "Copy to Output Directory" 设置为 "copy if newer")并像在 post。发布为 webjob 后(来自 visual studio,发布时,select "Webjob run mode" 为 "run on demand"),它可以 运行 按照您在 [=52] 中定义的时间表=].
我一直在为同样的问题而苦苦挣扎。这是我经过长期研究后的理解。
有两种Web作业:
- 触发
- 连续
触发一个必须手动触发,或者可以根据setting.job
中提供的CRON表达式时间表由应用服务触发。这些作业不存在于内存中一次 运行。
Continuous one always runs,所以进程一直存在于内存中。您可以使用 Webjobs SKD TimeTrigger
属性安排它。
您还会注意到仪表板中这两种 Webjob 类型之间的区别。
对于触发的 Web 作业,您将看到顶层作业运行,然后是调用的函数,最后是调用详细信息。
对于连续的 Webjobs,这将是调用的函数和最终的调用细节。缺少作业运行,因为这只是一个很长的 运行 作业。
检查 Kudu w3wp 进程下的 App Service / Process explorer 以查看 Webjobs 进程 运行。
请注意,在您提供配置的 Main
方法中,连续和触发的 Webjobs 必须以不同的方式启动。通过 Visual Studio.
添加特定类型的 Webjob 时,全部配置完毕
这是基于 WebJobs 2.x。
我的建议是
- 对于周期性(例如每几小时、几天一次)作业使用触发
那些,不工作时 运行 不会消耗资源,
- 对于更频繁的作业,请使用带有 TimeTrigger 的连续作业
属性,它会一直消耗资源,但不需要
额外的启动时间。
有很多教程使用以下代码通过 WebJob SDK 3.0 库创建 Webjobs。具体来说 'TimerTrigger'
public void DoSomethingUseful([TimerTrigger("0 */1 * * * *", RunOnStartup = false)] TimerInfo timerInfo, TextWriter log)
{
// Act on the DI-ed class:
string thing = _usefulRepository.GetFoo();
Console.WriteLine($"{DateTime.Now} - {thing}");
}
以上示例应该 运行 此方法作为每 1 分钟一次的 Web 作业。然而,这不起作用。
我在包含 setting.job 文件时设法让网络作业正常工作。
setting.job: { "schedule": "0 */1 * * * *" }
我的问题是这两者有什么区别?
更新:
请转到 azure webjobs 日志,然后您可以根据 SDK 定义的 timerTrigger 实际看到它 运行s(即使 Schedule 是 n/a,并且 settings.job为空,无所谓):
简而言之,当使用webjob sdk 3.x时,您可以使用TimerTrigger
属性来运行您定义的函数。不使用 webjobs SDK(如使用 .zip 文件或从 visual studio 发布控制台项目),您可以使用 setting.job 来定义计时器而不是 TimerTrigger
属性。
1.When 您正在使用 webjobs SDK 3.x 进行定时器触发,您应该添加这行代码:config.AddTimers();
.
这是我使用 webjobs SDK 的代码 3.x(这是一个在 visual studio 中创建的 .net core 2.2 控制台项目):
最新版本的软件包:Microsoft.Azure.WebJobs
/ Microsoft.Azure.WebJobs.Extensions
/ Microsoft.Extensions.Logging.Console
Program.cs中的代码:
class Program
{
static void Main(string[] args)
{
var builder = new HostBuilder()
.ConfigureWebJobs(config =>
{
config.AddTimers();
config.AddAzureStorageCoreServices();
})
.ConfigureLogging((context, b) =>
{
b.AddConsole();
}
)
.Build();
builder.Run();
}
}
然后创建一个新文件,如SayHelloWebJob.cs,并在其中编写代码:
public class SayHelloWebJob
{
public void ProcessCollateFiles([TimerTrigger("0 */1 * * * *", RunOnStartup = false)]TimerInfo timerInfo,TextWriter writer)
{
writer.WriteLine("hi, it is a testing running");
Console.WriteLine("test");
}
}
请注意,在 appsettings.json 文件中,添加您的存储连接字符串,如下所示:
{
"AzureWebJobsStorage": "DefaultEndpointsProtocol=https;AccountName=xxx;AccountKey=xxx;EndpointSuffix=core.windows.net"
}
然后运行工程,可以看到函数是按1分钟触发的:
2.For settings.job,例如。如果您只是创建一个控制台项目,并且不使用 webjobs sdk。由于您没有使用 webjobs sdk,因此不能使用 timerTrigger 属性。此时,您可以在该项目中包含 settings.job 文件(在 属性 中,将 "Copy to Output Directory" 设置为 "copy if newer")并像在 post。发布为 webjob 后(来自 visual studio,发布时,select "Webjob run mode" 为 "run on demand"),它可以 运行 按照您在 [=52] 中定义的时间表=].
我一直在为同样的问题而苦苦挣扎。这是我经过长期研究后的理解。
有两种Web作业:
- 触发
- 连续
触发一个必须手动触发,或者可以根据setting.job
中提供的CRON表达式时间表由应用服务触发。这些作业不存在于内存中一次 运行。
Continuous one always runs,所以进程一直存在于内存中。您可以使用 Webjobs SKD TimeTrigger
属性安排它。
您还会注意到仪表板中这两种 Webjob 类型之间的区别。 对于触发的 Web 作业,您将看到顶层作业运行,然后是调用的函数,最后是调用详细信息。 对于连续的 Webjobs,这将是调用的函数和最终的调用细节。缺少作业运行,因为这只是一个很长的 运行 作业。
检查 Kudu w3wp 进程下的 App Service / Process explorer 以查看 Webjobs 进程 运行。
请注意,在您提供配置的 Main
方法中,连续和触发的 Webjobs 必须以不同的方式启动。通过 Visual Studio.
这是基于 WebJobs 2.x。
我的建议是
- 对于周期性(例如每几小时、几天一次)作业使用触发 那些,不工作时 运行 不会消耗资源,
- 对于更频繁的作业,请使用带有 TimeTrigger 的连续作业 属性,它会一直消耗资源,但不需要 额外的启动时间。