在.NET MVC 中使用 Quartz.NET 建立可以修改時間的定時任務,並結合 Autofac 進行依賴注入的步驟

過朢發表於2024-07-24

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

相關文章