Quartz .NET 运行 多个任务
Quartz .NET Run multiple Tasks
我在我的 ASP .NET MVC 4 Web 应用程序中使用 Quartz .NET 来启动长运行ning 任务。长 运行 任务应在 POST 之后在控制器方法中启动,而不是 Application_Start。我的代码运行良好,但前提是没有其他任务 运行ning,否则 运行ning 任务停止。我如何 运行 同时执行多个任务并实现相同的 IJob Class? Quartz .NET 是该用例的正确框架吗?
public async Task<ActionResult> Processfile(HttpPostedFileBase file) {
var groupName = "Group";
var jobId = "processJob" + Guid.NewGuid();
// defines the job
IJobDetail job = JobBuilder.Create<ProcessJob>()
.WithIdentity(jobId, groupName)
.UsingJobData(parameters)
.Build();
// defines the trigger
ITrigger trigger = TriggerBuilder.Create()
.WithIdentity("processTrigger" + Guid.NewGuid(), groupName)
.WithPriority(1)
.StartNow()
.Build();
// Tell quartz to schedule the job using our trigger
await scheduler.ScheduleJob(job, trigger);
await scheduler.Start();
return new HttpStatusCodeResult(HttpStatusCode.OK, "OK");
}
调度程序应该在后台 运行。理想情况下,您有服务器进程 运行 并在需要时在那里添加作业。根据您的设置,ASP.NET 应用内的 运行 调度器可能是 a bad idea。
所以看到你的代码,scheduler.Start() 看起来很奇怪。
你打电话
等待 scheduler.Start();
每次。
而是尝试在定义调度程序的地方开始作业。
IScheduler scheduler = StdSchedulerFactory.GetDefaultScheduler();
scheduler.Start();
然后构建作业并触发并调用 await scheduler.ScheduleJob(job, trigger);
这样你的问题应该就解决了。
对于运行 多个作业,您可以声明IJobDetail
class 的多个实例和相应的ITrigger
对象。
例如,
IJobDetail job = JobBuilder.Create<Class1>.Build();
IJobDetail job2 = JobBuilder.Create<Class2>.Build();
ITrigger trigger = TriggerBuilder.Create()
.WithIdentity("trigger1", "group1")
.StartNow()
.WithSimpleSchedule(x => x
.WithIntervalInMinutes(1)
.RepeatForever())
.Build();
ITrigger trigger = TriggerBuilder.Create()
.WithIdentity("trigger2", "group1")
.StartNow()
.WithSimpleSchedule(x => x
.WithIntervalInMinutes(1)
.RepeatForever())
.Build();
然后运行将两个作业安排到同一个调度程序,
scheduler.ScheduleJob(job, trigger1);
scheduler.ScheduleJob(job2, trigger2);
然后启动调度程序
scheduler.Start();
或 或者,使用字典的方法 - 另一种方法请参考this article。
我在我的 ASP .NET MVC 4 Web 应用程序中使用 Quartz .NET 来启动长运行ning 任务。长 运行 任务应在 POST 之后在控制器方法中启动,而不是 Application_Start。我的代码运行良好,但前提是没有其他任务 运行ning,否则 运行ning 任务停止。我如何 运行 同时执行多个任务并实现相同的 IJob Class? Quartz .NET 是该用例的正确框架吗?
public async Task<ActionResult> Processfile(HttpPostedFileBase file) {
var groupName = "Group";
var jobId = "processJob" + Guid.NewGuid();
// defines the job
IJobDetail job = JobBuilder.Create<ProcessJob>()
.WithIdentity(jobId, groupName)
.UsingJobData(parameters)
.Build();
// defines the trigger
ITrigger trigger = TriggerBuilder.Create()
.WithIdentity("processTrigger" + Guid.NewGuid(), groupName)
.WithPriority(1)
.StartNow()
.Build();
// Tell quartz to schedule the job using our trigger
await scheduler.ScheduleJob(job, trigger);
await scheduler.Start();
return new HttpStatusCodeResult(HttpStatusCode.OK, "OK");
}
调度程序应该在后台 运行。理想情况下,您有服务器进程 运行 并在需要时在那里添加作业。根据您的设置,ASP.NET 应用内的 运行 调度器可能是 a bad idea。
所以看到你的代码,scheduler.Start() 看起来很奇怪。
你打电话 等待 scheduler.Start(); 每次。 而是尝试在定义调度程序的地方开始作业。
IScheduler scheduler = StdSchedulerFactory.GetDefaultScheduler();
scheduler.Start();
然后构建作业并触发并调用 await scheduler.ScheduleJob(job, trigger);
这样你的问题应该就解决了。
对于运行 多个作业,您可以声明IJobDetail
class 的多个实例和相应的ITrigger
对象。
例如,
IJobDetail job = JobBuilder.Create<Class1>.Build();
IJobDetail job2 = JobBuilder.Create<Class2>.Build();
ITrigger trigger = TriggerBuilder.Create()
.WithIdentity("trigger1", "group1")
.StartNow()
.WithSimpleSchedule(x => x
.WithIntervalInMinutes(1)
.RepeatForever())
.Build();
ITrigger trigger = TriggerBuilder.Create()
.WithIdentity("trigger2", "group1")
.StartNow()
.WithSimpleSchedule(x => x
.WithIntervalInMinutes(1)
.RepeatForever())
.Build();
然后运行将两个作业安排到同一个调度程序,
scheduler.ScheduleJob(job, trigger1);
scheduler.ScheduleJob(job2, trigger2);
然后启动调度程序
scheduler.Start();
或 或者,使用字典的方法 - 另一种方法请参考this article。