[许多教程使用以下代码通过WebJob SDK 3.0库创建Webjob。特别是'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分钟将此方法作为网络作业运行一次。但是,这不起作用。
[当包含setting.job文件时,我设法使webjob正常工作。
setting.job: { "schedule": "0 */1 * * * *" }
我的问题是这两者之间有什么区别?
更新:
请转到azure webjobs日志,然后您可以看到它实际上已按照SDK定义的timerTrigger运行(即使Schedule为n / a,并且settings.job为空,也没有关系:]]
简而言之,当使用webjob sdk 3.x时,您可以根据定义的时间使用TimerTrigger
属性运行该功能。无需使用webjobs SDK(例如使用.zip文件或从Visual Studio中发布控制台项目),就可以使用setting.job来定义计时器,而不是使用TimerTrigger
属性。
1。使用webjobs SDK 3.x进行计时器触发时,应添加以下代码行:config.AddTimers();
。
这是我使用webjobs SDK 3.x(这是在Visual Studio中创建的.net核心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。对于设置作业,例如。如果您只是创建一个控制台项目,而不使用webjobs sdk。由于您没有使用webjobs sdk,因此无法使用timerTrigger属性。目前,您可以在此项目中包含settings.job文件(在其属性中,将“复制到输出目录”设置为“如果更新则复制”),并像在帖子中一样配置计划的计时器。作为Webjob发布后(从Visual Studio中发布,发布时,将“ Webjob运行模式”选择为“按需运行”),它可以按照您在settings.job中定义的计划运行。
我一直在努力解决相同的问题。经过长时间的研究,这是我的理解。