添加引用
<ItemGroup>
<PackageReference Include="Quartz.AspNetCore" Version="3.14.0" />
<PackageReference Include="NLog" Version="5.4.0" />
<PackageReference Include="NLog.Web.AspNetCore" Version="5.4.0" />
</ItemGroup>
Program.cs文件
using Quartz.AspNetCore;
using Quartz;
using NLog.Web;
namespace Fox.Tasks
{
public class Program
{
public static void Main(string[] args)
{
var builder = WebApplication.CreateBuilder(args);
builder.Services.AddQuartz(q =>
{
q.ExecuteByCron<SendEmailJob>("0 0/2 * * * ?");
q.ExecuteByCron<SendTipsJob>("0 0/3 * * * ?");
});
builder.Services.AddQuartzServer(options =>
{
options.WaitForJobsToComplete = true;
});
builder.Host.UseNLog();
var app = builder.Build();
app.MapGet("/", () => "Hello World!");
app.Run();
}
}
}
QuartzExtensions扩展类
using Quartz;
namespace Fox.Tasks
{
public static class QuartzExtensions
{
public static IServiceCollectionQuartzConfigurator ExecuteByCron<T>(
this IServiceCollectionQuartzConfigurator configurator,
string cronExpression) where T : IJob
{
var jobName = typeof(T).Name;
var jobKey = new JobKey(jobName);
configurator.AddJob<T>(opts => opts.WithIdentity(jobKey));
configurator.AddTrigger(opts => opts
.ForJob(jobKey)
.WithIdentity($"{jobName}-trigger")
.WithCronSchedule(cronExpression));
return configurator;
}
}
}
任务SendEmailJob
using Quartz;
namespace Fox.Tasks
{
public class SendEmailJob : IJob
{
private readonly ILogger<SendEmailJob> _logger;
public SendEmailJob(ILogger<SendEmailJob> logger)
{
_logger = logger;
}
public async Task Execute(IJobExecutionContext context)
{
await Task.Delay(10);
_logger.LogError(" => 已运行1 ");
}
}
}
任务SendTipsJob
using Quartz;
namespace Fox.Tasks
{
public class SendTipsJob: IJob
{
private readonly ILogger<SendTipsJob> _logger;
public SendTipsJob(ILogger<SendTipsJob> logger)
{
_logger = logger;
}
public async Task Execute(IJobExecutionContext context)
{
await Task.Delay(10);
_logger.LogError(" => 已运行2 ");
}
}
}
nlog.config配置
<?xml version="1.0" encoding="utf-8"?>
<nlog xmlns="http://www.nlog-project.org/schemas/NLog.xsd"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<targets async="true">
<target name="file" xsi:type="File" FileName="logs/${shortdate}_${level}.txt" layout="[${longdate}] ${logger} ${message} ${newline}" />
</targets>
<rules>
<logger name="*" Level="Fatal" writeTo="file" />
<logger name="*" Level="Error" writeTo="file" />
<logger name="*" Level="Warn" writeTo="file" />
<logger name="*" Level="Info" writeTo="file" />
<logger name="*" Level="Debug" writeTo="file" />
<logger name="*" Level="Trace" writeTo="file" />
</rules>
</nlog>