目录
记录下Quartz的学习过程,希望可以帮助到需要的人,如果有不正确的地方还望指正。
1、环境:
开发环境:vs2019、.net core 3.1、Quartz3.2.0
官网:https://www.quartz-scheduler.net/
2、新建项目:
为了以后方便扩展,这里我创建的是 .NET Core Web 应用程序(MVC)
3、安装:
使用nuget管理器安装:搜索:Quartz
4、配置:
暂时用不到配置
5、示例:
提示:如果这里对.net core 不是很了解的,可以先了解一下再继续
注册服务:这里将调度工厂注册为单例
//注册调度器工厂
services.AddSingleton<ISchedulerFactory>(new StdSchedulerFactory());
修改 HomeController
注入调度工厂
//调度器工厂
private readonly ISchedulerFactory _schedulerFactory;
//构造函数注入
public HomeController(ISchedulerFactory schedulerFactory)
{
//注入调度器工厂
_schedulerFactory = schedulerFactory;
}
增加自定义Job ,打印当前时间
public class HelloJob : IJob
{
public async Task Execute(IJobExecutionContext context)
{
await Console.Out.WriteLineAsync($"{DateTime.Now}");
}
}
修改Index 为异步
public async Task<IActionResult> Index()
{
return View();
}
创建调度器并执行任务
public async Task<IActionResult> Index()
{
//1、从工厂获取调度器实例
IScheduler scheduler = await _schedulerFactory.GetScheduler();
//2、开始调度
await scheduler.Start();
//3、定义作业并将其绑定到我们的HelloJob类,作业名为job1 作业组名jobGroup1
IJobDetail job = JobBuilder.Create<HelloJob>()
.WithIdentity("job1", "jobGroup1")
.Build();
//4、创建一个立即执行的触发器,每间隔3秒触发一次,触发器名为trigger1,触发器组名triggerGroup1
ITrigger trigger = TriggerBuilder.Create()
.WithIdentity("trigger1", "triggerGroup1")
.StartNow()
.WithSimpleSchedule(x => x.WithIntervalInSeconds(3).RepeatForever())
.Build();
//5、将触发器与作业进行绑定
await scheduler.ScheduleJob(job, trigger);
return View();
}
修改launchSettings.json文件 删除IIS相关启动配置
{
"Logging": {
"LogLevel": {
"Default": "Information",
"Microsoft": "Warning",
"Microsoft.Hosting.Lifetime": "Information"
}
},
"AllowedHosts": "*"
}
运行结果:
运行后,会启动一个命令窗口和一个浏览器页面,并间隔三秒打印当前时间
6、完整代码
Startup.cs
using Microsoft.AspNetCore.Builder;
using Microsoft.AspNetCore.Hosting;
using Microsoft.Extensions.Configuration;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Hosting;
using Quartz;
using Quartz.Impl;
namespace QuartzLearn
{
public class Startup
{
public Startup(IConfiguration configuration)
{
Configuration = configuration;
}
public IConfiguration Configuration { get; }
public void ConfigureServices(IServiceCollection services)
{
services.AddControllersWithViews();
//注册调度器工厂
services.AddSingleton<ISchedulerFactory>(new StdSchedulerFactory());
}
public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
{
if (env.IsDevelopment())
{
app.UseDeveloperExceptionPage();
}
else
{
app.UseExceptionHandler("/Home/Error");
}
app.UseStaticFiles();
app.UseRouting();
app.UseAuthorization();
app.UseEndpoints(endpoints =>
{
endpoints.MapControllerRoute(
name: "default",
pattern: "{controller=Home}/{action=Index}/{id?}");
});
}
}
}
HomeController.cs
using Microsoft.AspNetCore.Mvc;
using Quartz;
using System;
using System.Threading.Tasks;
namespace QuartzLearn.Controllers
{
public class HomeController : Controller
{
//调度器工厂
private readonly ISchedulerFactory _schedulerFactory;
//构造函数注入
public HomeController(ISchedulerFactory schedulerFactory)
{
//注入调度器工厂
_schedulerFactory = schedulerFactory;
}
public async Task<IActionResult> Index()
{
//1、从工厂获取调度器实例
IScheduler scheduler = await _schedulerFactory.GetScheduler();
//2、开始调度
await scheduler.Start();
//3、定义作业并将其绑定到我们的HelloJob类,作业名为job1 作业组名jobGroup1
IJobDetail job = JobBuilder.Create<HelloJob>()
.WithIdentity("job1", "jobGroup1")
.Build();
//4、创建一个立即执行的触发器,每间隔3秒触发一次,触发器名为trigger1,触发器组名triggerGroup1
ITrigger trigger = TriggerBuilder.Create()
.WithIdentity("trigger1", "triggerGroup1")
.StartNow()
.WithSimpleSchedule(x => x.WithIntervalInSeconds(3).RepeatForever())
.Build();
//5、将触发器与作业进行绑定
await scheduler.ScheduleJob(job, trigger);
return View();
}
}
public class HelloJob : IJob
{
public async Task Execute(IJobExecutionContext context)
{
await Console.Out.WriteLineAsync($"{DateTime.Now}");
}
}
}