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();
}