net 4.6.1
nuget包
Quartz 3.0
Autofac 5.0
Autofac.Mvc5 5.0
步骤 1: 创建 Quartz 任务
首先,创建一个实现 IJob
接口的任务类。这个类将定义你希望定时执行的操作。
public class MyJob : IJob
{
public Task Execute(IJobExecutionContext context)
{
// 这里是你的定时任务逻辑
Debug.WriteLine($"Job executed at: {DateTime.Now}");
return Task.CompletedTask;
}
}
步骤 2: 配置 Quartz
创建一个 Quartz 配置类,用于设置调度器和作业。
public class QuartzConfig
{
public static IScheduler InitializeScheduler()
{
// 创建调度器工厂
var schedulerFactory = new StdSchedulerFactory();
var scheduler = schedulerFactory.GetScheduler().Result;
// 启动调度器
scheduler.Start().Wait();
return scheduler;
}
}
步骤 3: 使用 Autofac 进行依赖注入
在项目中配置 Autofac,以便将 IScheduler
和你的作业类注册到容器中。
public class AutofacConfig
{
public static void Register()
{
var builder = new ContainerBuilder();
// 注册 Quartz IScheduler
builder.Register(c => QuartzConfig.InitializeScheduler()).As<IScheduler>().SingleInstance();
// 注册作业
builder.RegisterType<MyJob>().AsSelf();
// 注册控制器
builder.RegisterControllers(typeof(MvcApplication).Assembly);
var container = builder.Build();
DependencyResolver.SetResolver(new AutofacDependencyResolver(container));
}
}
步骤 4: 创建控制器
创建一个控制器,用于调度作业和修改作业的时间。
public class JobController : Controller
{
private readonly IScheduler _scheduler;
public JobController(IScheduler scheduler)
{
_scheduler = scheduler;
}
// 方法用于创建和调度作业
public async Task<ActionResult> ScheduleJob(int Sec)
{
var job = JobBuilder.Create<MyJob>()
.WithIdentity("myJob", "group1")
.Build();
var trigger = TriggerBuilder.Create()
.WithIdentity("myTrigger", "group1")
.StartNow() // 立即开始
.WithSimpleSchedule(x => x
.WithIntervalInSeconds(Sec) // 设置以秒为单位的时间间隔
.RepeatForever()) // 永久重复
.Build();
await _scheduler.ScheduleJob(job, trigger);
return Content($"Job scheduled to run every {Sec} seconds!");
}
// 方法用于修改作业的时间
public async Task<ActionResult> RescheduleJob(int newSec)
{
var triggerKey = new TriggerKey("myTrigger", "group1");
var trigger = await _scheduler.GetTrigger(triggerKey) as ITrigger;
if (trigger != null)
{
var newTrigger = trigger.GetTriggerBuilder()
.WithSimpleSchedule(x => x
.WithIntervalInSeconds(newSec) // 修改间隔
.RepeatForever())
.Build();
await _scheduler.RescheduleJob(triggerKey, newTrigger);
return Content($"Job rescheduled to run every {newSec} seconds!");
}
return Content("Job not found!");
}
}
步骤 5: 在 Global.asax 中注册 Autofac
在 Global.asax
中调用 AutofacConfig.Register()
方法,以确保在应用程序启动时注册依赖项。
protected void Application_Start()
{
AreaRegistration.RegisterAllAreas();
FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters);
RouteConfig.RegisterRoutes(RouteTable.Routes);
BundleConfig.RegisterBundles(BundleTable.Bundles);
AutofacConfig.Register();
}